Это самое короткое и самое «решение в духе XSLT»:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tag[name='57A']">value1 </xsl:template>
<xsl:template match="tag[name='57D']">value2 </xsl:template>
</xsl:stylesheet>
применительно к этому документу XML :
<t>
<tag>
<name>57A</name>
<value>NORTESMM</value>
</tag>
<tag>
<name>57D</name>
<value>NORTESMM</value>
</tag>
</t>
желаемый, правильный результат:
value1 value2
Примечание :
Мы используем и переопределяем правило идентификации .Это самый фундаментальный и мощный шаблон проектирования XSLT.
Мы не используем <xsl:for-each>
и не используем условные инструкции XSLT .
Решение 2 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<my:values>
<val tagname="57A">value1 </val>
<val tagname="57B">value2 </val>
<val tagname="57C">value3 </val>
<val tagname="57D">value4 </val>
<val tagname="57E">value5 </val>
</my:values>
<xsl:variable name="vVals" select=
"document('')/*/my:values/*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tag">
<xsl:value-of select="$vVals[@tagname=current()/name]"/>
</xsl:template>
</xsl:stylesheet>
При применении к тому же XML-документу (см. Выше) снова получен требуемый, правильный результат :
value1 value4
Обратите внимание : Это решение можно использовать, когда мы хотим обработать множество различных возможных значений tag/name
.Мы используем таблицу для соответствующих значений и только один переопределяющий шаблон.