Это преобразование :
<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>
ОБНОВЛЕНИЕ : ОП указал в комментарии, что теперь ему нужно решение, в котором любой элемент не * 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>