使用xslt与错误形成的html的棘手问题

时间:2010-05-21 22:30:49

标签: html xslt xhtml

我对xslt(2.0)相当新,我遇到了一个棘手的问题。基本上我有一个格式错误的html文件,如下所示:

    <html>
    <body>

    <p> text 1 </p>
    <div> <p> text 2</p> </div>
    <p> Here is a list
        <ul>
            <ol> 
                <li> ListItem1 </li>
            <li> ListItem1 </li>
        </ol>
        <dl>
            <li> dl item </li>
            <li> dl item2 </li>
        </dl>
    </ul> 
    <div>
    <p> I was here</p>
    </div>
    </p>
</body>
</html>

我正在尝试将其放入一个格式良好的XML文件中。在我的xslt文件中,我递归地检查p或div的所有子项是否是其他p或div并且只是提升它们,否则我将它们用作独立段落。我扩展了这个想法,以便如果带有子列表的p或div显示正确,但不提升列表中的子项。

我遇到的一个问题是我得到的输出xml是以下

    <?xml version="1.0" encoding="utf-8"?><html>
    <body>

    <p> text 1 </p>
     <p> text 2</p> 
     Here is a list
    <ul>
        <ol> 
            <li> ListItem1 </li>
            <li> ListItem1 </li>
        </ol>
        <dl>
            <li> dl item </li>
            <li> dl item2 </li>
        </dl>
    </ul> 

    <p> I was here</p>



</body>
</html>

“这是一个列表”也需要在段落标签中!我疯了试图解决这个问题...... 任何输入/链接都将非常感激。

1 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output 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[descendant::div or descendant::p]
  |
   p[descendant::div or descendant::p]
  ">
   <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match=
  "div[descendant::div or descendant::p]/text()
  |
   p[descendant::div or descendant::p]/text()
  ">
   <xsl:element name="{name(..)}"
        namespace="{namespace-uri(..)}">
     <xsl:copy-of select="."/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时,会生成所需的正确输出

<html>
   <body>
      <p> text 1 </p>
      <p> text 2</p>
      <p> Here is a list

      </p>
      <ul>
         <ol>
            <li> ListItem1 </li>
            <li> ListItem1 </li>
         </ol>
         <dl>
            <li> dl item </li>
            <li> dl item2 </li>
         </dl>
      </ul>
      <p> I was here</p>
   </body>
</html>