Вот полное решение XSLT 1.0, которое, вероятно, является одним из самых простых (без xsl:for-each
, стиль push), кратчайшим :
<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="BOOK">
<xsl:if test="not(position()=1)">
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="BOOK/*">
<xsl:if test="not(position()=1)">|</xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<LIBRARY>
<BOOK>
<TITLE>Professional JINI</TITLE>
<AUTHOR>Sing Li</AUTHOR>
<PUBLISHER>Wrox Publications</PUBLISHER>
</BOOK>
<BOOK>
<TITLE>XSLT 2.0 Programmer's Reference</TITLE>
<AUTHOR>Michael Kay</AUTHOR>
<PUBLISHER>Wrox Publications</PUBLISHER>
</BOOK>
</LIBRARY>
желаемый, правильный результат получается :
Professional JINI|Sing Li|Wrox Publications
XSLT 2.0 Programmer's Reference|Michael Kay|Wrox Publications
II. Решение XSLT 2.0 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="BOOK">
<xsl:if test="not(position()=1)">
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:value-of select="*" separator="|"/>
</xsl:template>
</xsl:stylesheet>