Это неправильно:
<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
Причина заключается в том, что когда шаблоны применяются к дочерним элементам верхнего элемента, это включает в себя дочерние объекты, которые являются текстовыми узлами только в белом пространстве - между ev ery два последовательных 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.
Какой у вас XSLT? – Oded
Хороший вопрос (+1). См. Мой ответ для правильного и полного решения. Поймите, почему решение Одеда ... НЕПРАВИЛЬНО. :) –