Ну, <xsl:value-of select="docrev"/>
должен выбрать элемент с именем docrev
в XPath, поэтому он не может выбрать элемент на основе строкового значения docrev
.
В XSLT вы можете легко определитьклавиши для выбора элементов (или вообще узлов) по определенному значению, поэтому для вашего примера вы можете использовать ключ
<xsl:key name="value" match="object/*/value" use="../name"/>
, а затем в контексте вашего примера вы можете использовать key('value', 'docrev')
для выборасоответствующий value
элемент соответственно <xsl:value-of select="key('value', 'docrev')"/>
для вывода его значения:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="value" match="object/*/value" use="../name"/>
<xsl:template match="/">
<xsl:value-of select="key('value', 'docrev')"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / 6qVRKwW / 1
Или в более широкомВ контексте вы можете сначала проиндексировать элементы object
по атрибуту id
с помощью другого ключа <xsl:key name="id" match="object" use="@id"/>
, а затем использовать его вместе с предыдущим ключом:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="id" match="object" use="@id"/>
<xsl:key name="value" match="object/*/value" use="../name"/>
<xsl:template match="/">
<xsl:value-of select="key('value', 'docrev', key('id', '2018488'))"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / 6qVRKwW
Используя схемы или DTD, вы также можете предопределить определенные атрибуты или узлы как ID
с, а затем использовать функцию id
, аналогичную приведенной выше key
.