<page>
<p>
Republic of India (Bhārat Gaṇarājya),[c] is a country in South Asia.
<br/>It is the seventh-largest country by geographical area.
<br/> the second-most populous country with over 1.2 billion people, and the most populous democracy in the world.
</p>
</page>
我需要将<br>
替换为<p>
元素。
<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>
怎么做?
答案 0 :(得分:2)
执行此操作的一种方法是使用键来匹配 p 元素的所有子元素,并使用最前面的 br 元素(或父元素<如果没有前面的 br 元素,则为strong> 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。