これを行う 1 つの方法は、キーを使用して p 要素のすべての子要素を一致させ、それらを最も前にあるbr要素 (または前にbr要素がない場合は親p要素) でグループ化することです。
<xsl:key
name="bits"
match="p/node()[not(self::br)]"
use="generate-id((..|preceding-sibling::br[1])[last()])"/>
次に、 p内のすべてのbr要素を照合し、キー内の次の非 br 要素を出力できます。
<p>
<xsl:copy-of select="key('bits', generate-id())"/>
<p>
また、先行するbr要素を持たない子要素の最初のロットの場合もあります。
ここに完全なxsltがあります
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="bits" match="p/node()[not(self::br)]" use="generate-id((..|preceding-sibling::br[1])[last()])"/>
<xsl:template match="p">
<p>
<xsl:apply-templates select="key('bits', generate-id())"/>
</p>
<xsl:apply-templates select="br"/>
</xsl:template>
<xsl:template match="p/br">
<p>
<xsl:apply-templates select="key('bits', generate-id())"/>
</p>
</xsl:template>
<xsl:template match="page">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
サンプル XML に適用すると、次のように出力されます。
<p>
Republic of India (Bhārat Gaṇarājya),[c] is a country in South Asia.
</p>
<p>
It is the seventh-largest country by geographical area.
</p>
<p>
the second-most populous country with over 1.2 billion people, and the most populous democracy in the world.
</p>
これは、ネストされたp要素も処理し、テキスト内にpおよび **以外の HTML を保持する必要があります。