Это неправильно :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="elm">
<xsl:value-of select="concat(position(), ' ', @val)"/>
</xsl:template>
</xsl:stylesheet>
При работе со многими процессорами XSLT это приведет к следующему (нежелательному) выводу :
2 data1
4 data2
6 data3
8 data4
10 data5
12 data6
14 data7
Причина в том, что когда шаблоны применяются к дочерним элементам верхнего элемента, это включает дочерние элементы, которые являются текстовыми узлами только для пробелов - между каждыми двумя последовательными elm
элементами.
Итак, решение Одеда неверно .
Вот одно правильное решение (и одно из самых коротких из возможных):
<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="elm">
<xsl:value-of select="concat(position(), ' ', @val, '
')"/>
</xsl:template>
</xsl:stylesheet>
Это преобразование дает правильный результат :
1 data1
2 data2
3 data3
4 data4
5 data5
6 data6
7 data7
Примечание :
Использование <xsl:strip-space elements="*"/>
, чтобы заставить процессор XSLT отбрасывать любые текстовые узлы только для пробелов.
Использование функции XPath concat()
для склеивания позиции, данных и символа NL.