Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 |
|---|---|
|
Eine Knotengruppe mit |
|
Eine Knotengruppe mit |
|
Eine Knotengruppe mit allen |
|
Die Knotengruppe mit allen |
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 |
|
Vergleiche |
5 |
|
Vergleiche |
6 |
|
Union |
7 |
|
Boolescher not-Wert |
8 |
|
Boolescher and-Wert |
9 |
|
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>