如何用xslt中的<p>元素替换<br/>?</p>

时间:2012-05-07 06:33:52

标签: xml xslt

<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>

怎么做?

1 个答案:

答案 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。