2010-05-21 45 views
1

我對xslt(2.0)相當新,並且遇到一些棘手問題。基本上我有一個格式不好的HTML文件,如下所示:與使用xslt形成嚴重的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> 

「這裏是一個列表」需要在段落標記呢!我瘋了試圖解決這個問題... 任何輸入/鏈接將不勝感激。

+0

這不是一個回答你的問題,但HTML Tidy在處理這類問題方面做得非常出色,無需您大驚小怪。如果您需要XSLT建議,您可能需要發佈代碼的相關部分。 – 2010-05-21 23:43:42

+0

好問題(+1)。看到我的答案是一個簡短但完整的解決方案。 :) – 2010-05-22 01:03:29

回答

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

非常感謝您的幫助!找到知道xslt的人是非常困難的。乾杯 – Pharaon 2010-05-25 16:19:25