Ваша проблема здесь :
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
В отличие от XSLT 1.0 в XSLT 2.0 команда xsl:value-of
выводит все элементы последовательности, указанной в ееselect
атрибут.
Это означает, что
<xsl:value-of select="./namecell/@stuff"/>
выводит все stuff
атрибуты (1 и 2)
, затем следующая инструкция:
<xsl:value-of select="./namecell" />
выводит строковое значение двух namecell
дочерних элементов - соответственно "A"
и "B"
.
Решение :
Заменить:
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
с :
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/(@stuff|entity)"/>
</xsl:for-each>
Полный код этой модификации: :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="Section/Chapter//nametable"/>
</xsl:template>
<xsl:template match="nametable">
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/(@stuff|entity)"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
и когда это преобразование применяется к предоставленному XML-документу :
<Section>
<Chapter>
<nametable>
<namerow>
<namecell stuff="1">
<entity>A</entity>
</namecell>
<namecell stuff="2">
<entity>B</entity>
</namecell>
</namerow>
</nametable>
</Chapter>
</Section>
желаемый результат получается :
1 A 2 B
Второе решение (вероятно, то, что вы намеревались сделать в первую очередь):
Заменить :
<xsl:template match="nametable">
<xsl:for-each select="./namerow">
<xsl:value-of select="./namecell/@stuff"/>
<xsl:value-of select="./namecell" />
</xsl:for-each>
</xsl:template>
на :
<xsl:template match="nametable">
<xsl:for-each select="namerow/namecell">
<xsl:value-of select="@stuff"/>
<xsl:value-of select="entity"/>
</xsl:for-each>
</xsl:template>
Теперь вы снова получите желаемый результатlt :
1A2B