Одним из способов достижения этого является использование клавиши для соответствия всем span , которые предшествуют данному br тегу
<xsl:key name="para" match="span" use="generate-id(following-sibling::br[1])" />
т.е. сгруппировать все теги span по первым br , следующим за ними.
Затем вы можете сопоставить элементы br ииспользуйте этот ключ, чтобы получить все ассоциированные span предшествующие ему теги
<xsl:template match="br">
<p>
<xsl:apply-templates select="key('para', generate-id())" />
</p>
Вот полный XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="para" match="span" use="generate-id(following-sibling::br[1])" />
<xsl:template match="/">
<body>
<xsl:apply-templates select="body/p" />
</body>
</xsl:template>
<xsl:template match="p">
<xsl:apply-templates select="br" />
<xsl:if test="span[not(following-sibling::br)]">
<p>
<xsl:apply-templates select="span[not(following-sibling::br)]" />
</p>
</xsl:if>
</xsl:template>
<xsl:template match="br">
<p>
<xsl:apply-templates select="key('para', generate-id())" />
</p>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когдаприменяется к следующему входному XML (я предполагаю, что ваш образец заключен в тег body , чтобы сделать его действительным XML
<body>
<p>
<span>Foo 1</span>
<br/>
</p>
<p>
<span>Foo 2</span>
<br/>
<span>Foo 3</span>
<span>Foo 4</span>
<br/>
</p>
<p>
<span>Foo 5</span>
<span>Foo 6</span>
<br/>
<span>Foo 7</span>
<span>Foo 8</span>
<span>Foo 9</span>
<br/>
<span>Foo 10</span>
</p>
</body>
Выводится следующее:
<body>
<p>
<span>Foo 1</span>
</p>
<p>
<span>Foo 2</span>
</p>
<p>
<span>Foo 3</span>
<span>Foo 4</span>
</p>
<p>
<span>Foo 5</span>
<span>Foo 6</span>
</p>
<p>
<span>Foo 7</span>
<span>Foo 8</span>
<span>Foo 9</span>
</p>
<p>
<span>Foo 10</span>
</p>
</body>
Обратите внимание, что в качестве примера я добавил случай, чтобы справиться с тегами span , которые не имеют следующих тегов br в абзаце.