В XSLT 2/3 это еще один вариант использования для xsl:for-each-group group-adjacent
, в данном случае с xsl:for-each-group select="node()" group-adjacent="boolean(self::Xref)"
:
<xsl:template match="para">
<xsl:for-each-group select="node()" group-adjacent="boolean(self::Xref)">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:copy-of select="current-group()"/>
</xsl:when>
<xsl:otherwise>
<para>
<xsl:copy-of select="current-group()"/>
</para>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>
https://xsltfiddle.liberty -development.net / jz1PuP7
В XSLT 1 с рекурсией брата вы можете работать по направлениям
<xsl:template match="para[Xref]">
<xsl:apply-templates select="node()[1]"/>
</xsl:template>
<xsl:template match="para/node()[not(self::Xref)]">
<xsl:param name="group" select="."/>
<xsl:apply-templates select="following-sibling::node()[1]">
<xsl:with-param name="group" select="$group | ."/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="para/node()[not(self::Xref) and not(following-sibling::Xref)][last()]">
<xsl:param name="group" select="."/>
<para>
<xsl:copy-of select="$group | ."/>
</para>
</xsl:template>
<xsl:template match="para/Xref">
<xsl:param name="group"/>
<xsl:if test="$group">
<para>
<xsl:copy-of select="$group"/>
</para>
</xsl:if>
<xsl:copy-of select="."/>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
https://xsltfiddle.liberty -development.net / jz1PuP7 / 2
Но в крайних случаях он может легко сломаться, поэтому я не проверил его полностью, чтобы определить, дает ли какая-либо последовательность внешних ссылок и других узлов правильный результат. А в приведенном выше есть шаблоны для этой конкретной части ввода (т. Е. para[Xref]
) и ее преобразования, добавьте преобразование идентичности для обработки остальных.