Вот компактный способ определения необходимых переменных:
<xsl:variable name="vKey1" select=
"(/*/rootcontainer/dictionary/key1
|
/*/dictionary/key1
)
[1]
"/>
<xsl:variable name="vKey2" select=
"(/*/rootcontainer/dictionary/key2
|
/*/dictionary/key2
)
[1]
"/>
При использовании простой таблицы стилей xslt:
<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>
и применяется к предоставленному документу XML (исправлено, так как оно было сильно искажено):
<rootnode>
<rootcontainer>
<dictionary>
<key1> value </key1>
</dictionary>
<pages>
<page1> </page1>
</pages>
</rootcontainer>
<dictionary>
<key1> independent value </key1>
<key2> value 2 </key2>
</dictionary>
</rootnode>
желаемый, правильный результат получается :
Key1: value
Key2: value 2
Объяснение
Выражение:
(/*/rootcontainer/dictionary/key1
|
/*/dictionary/key1
)
[1]
означает :
Возьмите набор узлов (потенциально) двух элементов, а из них - первый в порядке документа.
Поскольку второй из этих двух элементов появляется позже в порядке документа, он будет первым (и выбранным), только если первое из двух выражений XPath, окружающих оператор объединения (|
), не выберет любой элемент.