Freigeben über


Set-Vorgänge

XPath (XML Path Language) unterstützt die Set-Operation |.

Union-Operator (|)

Der |- oder Union-Operator gibt die Union der zwei Operanden zurück, die Knotengruppen sein müssen. Beispielsweise gibt //author | //publisher eine Knotengruppe zurück, in der alle //author-Knoten und alle //publisher-Knoten kombiniert sind. Mehrere Union-Operatoren können verkettet werden, um mehrere Knotengruppen zu kombinieren. Beispielsweise gibt //author | //publisher | //editor | //book-seller eine Knotengruppe mit allen //author, //publisher, //editor und //book-seller elements zurück. Der Union-Operator behält die Dokumentreihenfolge bei und gibt keine Duplikate zurück.

Beispiele

Ausdruck Bezieht sich auf

first-name | last-name

Eine Knotengruppe mit <first-name>-Elementen und <last-name>-Elementen im aktuellen Kontext.

(bookstore/book | bookstore/magazine)

Eine Knotengruppe mit <book>-Elementen und <magazine>-Elementen in einem <bookstore>-Element.

book | book/author

Eine Knotengruppe mit allen <book>-Elementen und allen <author>-Elementen in <book>-Elementen.

(book | magazine)/price

Die Knotengruppe mit allen <price>-Elementen von entweder <book>-Elementen oder <magazine>-Elementen.

Beispiel

Im folgenden Beispiel wird die Auswirkung des Union-Operators dargestellt.

XML-Datei (test.xml)

<?xml version="1.0"?>
<test>
    <x a="1">
      <x a="2" b="B">
        <x>
          <y>y31</y>
          <y>y32</y>
        </x>
      </x>
    </x>
</test>

XSLT-Datei (test.xsl)

Im folgenden XSLT-Stylesheet werden alle <x>-Elemente ausgewählt, deren a-Attribut gleich 2 ist. Außerdem werden jene <x>-Elemente ausgewählt, die keine Attribute aufweisen.

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

   <!-- Suppress text nodes not covered in subsequent template rule. -->
   <xsl:template match="text()"/>

  <!-- Handles a generic element node. -->
   <xsl:template match="*">
      <xsl:element name="{name()}">
         <xsl:apply-templates select="*|@*" />
         <xsl:if test="text()">
            <xsl:value-of select="."/>
         </xsl:if>
      </xsl:element>
   </xsl:template>

   <!-- Handles a generic attribute node. -->
   <xsl:template match="@*">
      <xsl:attribute name="{name()}">
         <xsl:value-of select="."/>
      </xsl:attribute>
   </xsl:template>

   <xsl:template match="/test">
      <xsl:apply-templates select="//x[@a=2] | //x[not(@*)]"/>
   </xsl:template>

</xsl:stylesheet>

Die Transformation führt zu folgendem Ergebnis:

<x a="2" b="B">
   <x>
      <y>31</y>
      <y>y32</y>
   </x>
</x>
<x>
   <y>y31</y>
   <y>y32</y>
</x>

Rangfolge

In der folgenden Tabelle ist die Rangfolge (von höchster zu niedrigster Priorität) zwischen booleschen Operatoren und Vergleichsoperatoren dargestellt.

Rangfolge Operatoren Beschreibung

1

( )

Gruppierung

2

[ ]

Filter

3

/

//

Path-Vorgänge

4

&lt;

&lt;=

&gt;

&gt;=

Vergleiche

5

=

!=

Vergleiche

6

|

Union

7

not()

Boolescher not-Wert

8

and

Boolescher and-Wert

9

or

Boolescher or-Wert

Beispiel

Im folgenden Beispiel wird die Auswirkung der oben aufgeführten Operatorenrangfolge dargestellt.

XML-Datei (test.xml)

<?xml version="1.0"?>
<test>

    <x a="1">
      <x a="2" b="B">
        <x>
          <y>y31</y>
          <y>y32</y>
        </x>
      </x>
    </x>

    <x a="1">
      <x a="2">
        <y>y21</y>
        <y>y22</y>
      </x>
    </x>

    <x a="1">
      <y>y11</y>
      <y>y12</y>
    </x>

    <x>
      <y>y03</y>
      <y>y04</y>
    </x>

</test>

Basic XSLT-Datei (test.xsl)

Diese Basic XSLT-Datei wird als Anfangspunkt für die folgende Reihe von Abbildungen verwendet.

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

   <!-- Suppress text nodes not covered in subsequent template rule. -->
   <xsl:template match="text()"/>

  <!-- Handles a generic element node. -->
   <xsl:template match="*">
      <xsl:element name="{name()}">
         <xsl:apply-templates select="*|@*" />
         <xsl:if test="text()">
            <xsl:value-of select="."/>
         </xsl:if>
      </xsl:element>
   </xsl:template>

   <!-- Handles a generic attribute node. -->
   <xsl:template match="@*">
      <xsl:attribute name="{name()}">
         <xsl:value-of select="."/>
      </xsl:attribute>
   </xsl:template>

</xsl:stylesheet>

Fall 0. Testlauf

Die folgende Vorlagenregel kann dem XSLT-Stylesheet hinzugefügt werden.

<xsl:template match="/test">
      <xsl:apply-templates select="*|@*/>
   </xsl:template>

Dadurch wird ein mit dem ursprünglichen Dokument identisches XML-Dokument ohne <?xml version="1.0"?>-Verarbeitungsanweisungen erstellt.

In den folgenden Fällen werden die verschiedenen Möglichkeiten zum Schreiben dieser Vorlagenregel veranschaulicht. Es geht darum, die Reihenfolge darzustellen, in der XPath-Operatoren an ein Element gebunden werden.

Fall 1: () bindet stärker als []

In der folgenden Vorlagenregel wird das erste <y>-Element in der Dokumentreihenfolge aus allen <y>-Elementen im Quelldokument ausgewählt.

<xsl:template match="/test">
      <xsl:apply-templates select="(//y)[1]"/>
   </xsl:template>

Daraus ergibt sich folgendes Ergebnis:

<y>y31</y>

Fall 2: [] bindet stärker als / oder //

In der folgenden Vorlagenregel werden alle <y>-Elemente ausgewählt, die das jeweils erste Element unter den nebengeordneten Elementen darstellen.

<xsl:template match="/test">
   <xsl:apply-templates select="//y[1]"/>
</xsl:template>

Daraus ergibt sich folgendes Ergebnis:

<y>y31</y>

<y>y21</y>

<y>y11</y>

<y>y03</y>

Fall 3: and, not

In der folgenden Vorlagenregel werden alle <x>-Elemente ausgewählt, die keine untergeordneten <x>-Elemente aufweisen, die über ein übergeordnetes <x>-Element verfügen, aber keine Attribute aufweisen.

<xsl:template match="/test">
   <xsl:apply-templates select=
    "//x[./ancestor::*[name()='x'] and *[name()!='x'] and not(@*)]"/>
</xsl:template>

Das Ergebnis ist ein einzelnes <x>-Element, das unten mit den dazugehörigen untergeordneten Elementen aufgeführt ist.

<x>
   <y>y31</y>
   <y>y32</y>
</x>

Fall 4: or, and, not

In der folgenden Vorlagenregel wird jedes <x>-Element ausgewählt, das das untergeordnete Element eines <x>-Elements oder nicht das übergeordnete Element eines <x>-Elements darstellt und keine Attribute aufweist.

<xsl:template match="/test">
   <xsl:apply-templates select=
    "//x[./ancestor::*[name()='x'] or *[name()!='x'] and not(@*)]"/>
</xsl:template>

Daraus ergibt sich eine Knotengruppe mit folgenden <x>-Elementen, die unten mit den dazugehörigen untergeordneten Elementen aufgeführt sind.

<x a="2" b="B">
  <x>
     <y>y31</y>
     <y>y32</y>
  </x>
</x>
<x>
  <y>y31</y>
  <y>y32</y>
</x>
<x a="2">
  <y>y21</y>
  <y>y22</y>
</x>
<x>
  <y>y03</y>
  <y>y04</y>
</x>

Fall 5: and, or, not

In der folgenden Vorlagenregel wird jedes <x>-Element ausgewählt, das das untergeordnete Element eines <x>-Elements, jedoch kein übergeordnetes Element eines <x>-Elements darstellt oder über keine Attribute verfügt.

<xsl:template match="/test">
   <xsl:apply-templates select=
    "//x[./ancestor::*[name()='x'] and *[name()!='x'] or not(@*)]"/>
</xsl:template>

Daraus ergibt sich eine Knotengruppe mit folgenden <x>-Elementen, die unten mit den dazugehörigen untergeordneten Elementen aufgeführt sind.

<x>
   <y>y31</y>
   <y>y32</y>
</x>
<x a="2">
  <y>y21</y>
  <y>y22</y>
</x>
<x>
  <y>y03</y>
  <y>y04</y>
</x>