Основная проблема заключается в следующем: xsl: if оператор
<xsl:if test="//attributes//attribute[(attributeName = 'salience')]">
На этом этапе контекст по-прежнему является корневым узлом, поэтому все, что он делает, это проверяет наличие *Элемент 1006 * attibute , вы фактически не позиционируете себя на узле.Таким образом, когда вы делаете xsl: value-of , вы просто получаете первое значение в XML.
Вместо использования xsl: if, вам, вероятно, следует попробовать сопоставить элемент attribute , например,
<xsl:apply-templates select="attributes/attribute[attributeName = 'salience']"/>
Весь XSLT будет выглядеть следующим образом
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="attributes/attribute[attributeName = 'salience']"/>
</xsl:template>
<xsl:template match="attribute">
<xsl:element name="{attributeName}">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
При применении к вашемувходной XML, выходные данные выглядят следующим образом:
<salience>73</salience>
Обратите внимание на использование xsl: element
<xsl:element name="{attributeName}">
Это позволяет избежать жесткого кода salience в вашем подходящем шаблоне, что делает его более общим, если вы хотите сопоставить другие элементы аналогичным образом.