Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<People>
<xsl:apply-templates/>
</People>
</xsl:template>
<xsl:template match="Person">
<xsl:value-of select=
"concat(.,
substring(',', 1 div not(position()=last()))
)"/>
</xsl:template>
</xsl:stylesheet>
применительно к предоставленному XML-документу :
<People>
<Person>John</Person>
<Person>Paul</Person>
<Person>George</Person>
<Person>Ringo</Person>
</People>
создает искомыйрезультат :
<People>John,Paul,George,Ringo</People>
Обратите внимание :
Не допускаются структурные зависимости между элементами впоследовательность - например, мы не используем тот факт, что они являются братьями и сестрами.
Приведенный выше факт делает наше преобразование более универсальным - его можно использовать вситуации, когда элементы последовательности не являются братьями и сестрами или даже принадлежат более чем одному документу XML.
Умный трюк XPath 1.0 помогает избежать использования различных шаблонов дляпервый / последний элемент, а в остальном:
В XPath 1.0 true()
, false()
преобразуются в 1
, 0
.
1 div 0
- positive-infinity
и substring(anyString, 1, $x)
, где $x
- positive-infinity
, полная строка.