这种转变:
<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:key name="kFollowing" match="data"
use="generate-id(preceding-sibling::p[1])"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<xsl:call-template name="identity"/>
<xsl:apply-templates mode="group"
select="key('kFollowing',generate-id())[1]"/>
</xsl:template>
<xsl:template match="data" mode="group">
<data>
<xsl:apply-templates mode="group"
select="key('kFollowing',
generate-id(preceding-sibling::p[1])
)/node()"/>
</data>
</xsl:template>
<xsl:template match="data/node()" mode="group">
<xsl:if test="not(position() = 1)"><xsl:text> </xsl:text></xsl:if>
<xsl:apply-templates select="."/>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
<xsl:template match="/*/*[not(self::p)]"/>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<root>
<p>Sample data 1</p>
<data>1</data>
<data>2</data>
<data>3</data>
<data>4</data>
<p>Sample data 2</p>
<p>Sample data 3</p>
<data>a</data>
<data>b</data>
<data>c
<i>d</i>e
</data>
<data>d</data>
<p>Sample data 4</p>
</root>
产生想要的正确结果:
<root>
<p>Sample data 1</p>
<data>1 2 3 4</data>
<p>Sample data 2</p>
<p>Sample data 3</p>
<data>a b c <i>d</i> e d</data>
<p>Sample data 4</p>
</root>