XHTML。在段落中包含<div>文本,并使用XSLT 1.0 </div>将<br/>转换为段落

时间:2011-08-09 11:18:17

标签: xslt xhtml

我正在寻找一种快速简便的方法来使用XSLT 1.0转换他的XML(类似于XHTML):

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head/>
  <body>
    <div>Hello<a href="http://google.com">this is the first</a>line.<p>This the second.<br/>And this the third one.</p></div>
  </body>
 </html>

到这一个:

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head/>
  <body>
    <div>
        <p>Hello<a href="http://google.com">this is the first</a>line.</p>
        <p>This the second.</p>
        <p>And this the third one.</p>
    </div>
  </body>
 </html>

我在想XSLT 1.0中的树木行走算法。复杂的是,例如随附的<a>个链接。并且不应删除现有的<p>

愿有人帮我这个吗?非常感谢。

1 个答案:

答案 0 :(得分:5)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="div[text() and p]">
  <div>
   <p>
     <xsl:apply-templates select="node()[not(self::p or preceding-sibling::p)]"/>
   </p>
   <xsl:apply-templates select="p | p/following-sibling::node()"/>
  </div>
 </xsl:template>

 <xsl:template match="p[text() and br]">
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match=
  "p/text()
    [preceding-sibling::node()[1][self::br]
    or
     following-sibling::node()[1][self::br]
    ]">
  <p><xsl:value-of select="."/></p>
 </xsl:template>

 <xsl:template match="p/br"/>
</xsl:stylesheet>

应用于提供的XML文档

<html>
    <head/>
    <body>
        <div>Hello
            <a href="http://google.com">this is the first</a>line.
            <p>This the second.<br/>And this the third one.</p>
        </div>
    </body>
</html>

生成想要的正确结果

<html>
   <head/>
   <body>
      <div>
         <p>Hello
            <a href="http://google.com">this is the first</a>line.
            </p>
         <p>This the second.</p>
         <p>And this the third one.</p>
      </div>
   </body>
</html>