这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kFollowing" match="list"
use="generate-id(preceding-sibling::para[1])"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="para">
<p>
<xsl:apply-templates/>
</p>
<xsl:variable name="vFol"
select="key('kFollowing',generate-id())"/>
<xsl:if test="$vFol">
<ol>
<xsl:apply-templates mode="copy"
select="key('kFollowing',generate-id())"/>
</ol>
</xsl:if>
</xsl:template>
<xsl:template match="list" mode="copy">
<li><xsl:value-of select="."/></li>
</xsl:template>
<xsl:template match="list"/>
</xsl:stylesheet>
当应用于以下 XML 文档时(将提供的输入包装在单个顶部元素中):
<t>
<para>blah blah</para>
<list>num1</list>
<list>num2</list>
<list>num3</list>
<para>blah blah</para>
<list>num1</list>
<list>num2</list>
<para>blah blah blah blah blah</para>
</t>
产生想要的正确结果:
<t>
<p>blah blah</p>
<ol>
<li>num1</li>
<li>num2</li>
<li>num3</li>
</ol>
<p>blah blah</p>
<ol>
<li>num1</li>
<li>num2</li>
</ol>
<p>blah blah blah blah blah</p>
</t>
更新:OP 在评论中表示,现在他想要一个解决方案,其中任何非list
元素都可以分隔一组相邻的list
兄弟姐妹。
这是更改后问题的解决方案:
<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="list"
use="generate-id(preceding-sibling::*[not(self::list)][1])"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(self::list) and following-sibling::*[1][self::list]]">
<xsl:call-template name="identity"/>
<xsl:variable name="vFol"
select="key('kFollowing',generate-id())"/>
<xsl:if test="$vFol">
<ol>
<xsl:apply-templates mode="copy"
select="key('kFollowing',generate-id())"/>
</ol>
</xsl:if>
</xsl:template>
<xsl:template match="list" mode="copy">
<li><xsl:value-of select="."/></li>
</xsl:template>
<xsl:template match="list"/>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时(请注意,分隔元素现在具有随机名称):
<t>
<bara>blah blah</bara>
<list>num1</list>
<list>num2</list>
<list>num3</list>
<vara>blah blah</vara>
<list>num1</list>
<list>num2</list>
<dara>blah blah blah blah blah</dara>
</t>
产生了想要的正确结果:
<t>
<bara>blah blah</bara>
<ol>
<li>num1</li>
<li>num2</li>
<li>num3</li>
</ol>
<vara>blah blah</vara>
<ol>
<li>num1</li>
<li>num2</li>
</ol>
<dara>blah blah blah blah blah</dara>
</t>