この変換:
<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>