Hier finden Sie eine kompakte Möglichkeit, die erforderlichen Variablen zu definieren:
<xsl:variable name="vKey1" select=
"(/*/rootcontainer/dictionary/key1
|
/*/dictionary/key1
)
[1]
"/>
<xsl:variable name="vKey2" select=
"(/*/rootcontainer/dictionary/key2
|
/*/dictionary/key2
)
[1]
"/>
Wenn sie in ein einfaches xslt-Stylesheet verpackt sind:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vKey1" select=
"(/*/rootcontainer/dictionary/key1
|
/*/dictionary/key1
)
[1]
"/>
<xsl:variable name="vKey2" select=
"(/*/rootcontainer/dictionary/key2
|
/*/dictionary/key2
)
[1]
"/>
<xsl:template match="/">
Key1: <xsl:value-of select="$vKey1"/>
Key2: <xsl:value-of select="$vKey2"/>
</xsl:template>
</xsl:stylesheet>
und auf das bereitgestellte XML-Dokument angewendet (korrigiert, da sie stark fehlerhaft war):
<rootnode>
<rootcontainer>
<dictionary>
<key1> value </key1>
</dictionary>
<pages>
<page1> </page1>
</pages>
</rootcontainer>
<dictionary>
<key1> independent value </key1>
<key2> value 2 </key2>
</dictionary>
</rootnode>
das gewünschte, korrekte Ergebnis erzielt wird :
Key1: value
Key2: value 2
Erläuterung :
Der Ausdruck:
(/*/rootcontainer/dictionary/key1
|
/*/dictionary/key1
)
[1]
bedeutet :
Man nehme das Nodeset von (möglicherweise) zwei Elementen und entnehme daraus das erste Element in der Reihenfolge der Dokumente.
Da das zweite dieser beiden Elemente in der Dokumentreihenfolge später kommt, wird es nur dann das erste (und ausgewählte) sein, wenn der erste der beiden XPath-Ausdrücke, die die Vereinigung ( |
), wählt kein Element aus.