2013-01-11 91 views
1

使用瀏覽器,我想要將可能包含某些HTML的XML轉換爲XSL樣式表。 在this article,用戶Mads Hansen寫道:使用替代命名空間在XML內進行XSL轉換

如果精心形成你的HTML,那麼就嵌入HTML標籤不逃逸或CDTATA包裝 。如果可能的話,它有助於保持您的內容在XML中。它爲您提供更多靈活性來轉換和操作文檔。 您可以爲HTML設置一個名稱空間,以便您可以從包裝它的其他XML中消除您的HTML標記的歧義。

我喜歡建議的解決方案,但無法使其工作。我用H作爲命名空間HTML:

temp.xml

<?xml version='1.0' encoding='UTF-8' ?> 
<?xml-stylesheet type='text/xsl' href='temp.xsl'?> 
<root xmlns:h="http://www.w3.org/1999/xhtml"> 
    <MYTAG title="thisnthat"> 
    text before ol 
    <h:ol> 
     <h:li>item</h:li> 
     <h:li>item</h:li> 
    </h:ol> 
    text after ol 
    </MYTAG> 
</root> 

temp.xsl

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:h="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/root"> 
    <html lang="en-US"> 
     <head> 
     <meta charset="UTF-8" /> 
     <title></title> 
     </head> 
     <body> 
     <xsl:apply-templates /> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template match="MYTAG"> 
    <h3> 
     <xsl:value-of select="@title" /> 
    </h3> 
    <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet> 

輸出(從Firefox 18)是:

thisnthat 
text before ol item item text after ol 
+0

輸出是在瀏覽器窗口中呈現的還是在轉換後的實際HTML中顯示的?如果是前者,請顯示HTML(使用Firebug)。另外,如果沒有標識轉換,最後一個'apply-templates'只會寫出ol的文本(即不復制節點)。 –

+1

「我喜歡所提出的解決方案,但無法使其工作。」不能做什麼工作?預期的結果是什麼?請向我們展示原始輸出,而不僅僅是它在Firefox中的外觀。 – JLRishe

+0

那麼,問題是什麼?我沒看到一個。 –

回答

0

由於你正在生成最終的HTML並且處於控制之中,我不確定你爲什麼要在這裏使用命名空間。只有在自定義標籤和標準HTML之間存在衝突時才需要這樣做 - 即,如果您的自定義<a...>標籤與HTML具有不同的語義。我有你的變換由

一)刪除所有HTML命名空間

b)將身份轉換

的test.xml

<?xml version='1.0' encoding='UTF-8' ?> 
<?xml-stylesheet type='text/xsl' href='test.xsl'?> 
<root> 
    <MYTAG title="thisnthat"> 
     text before ol 
     <ol> 
      <li>item</li> 
      <li>item</li> 
     </ol> 
     text after ol 
    </MYTAG> 
</root> 

test.xsl

工作
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/root"> 
     <html lang="en-US"> 
      <head> 
       <meta charset="UTF-8" /> 
       <title></title> 
      </head> 
      <body> 
       <xsl:apply-templates /> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="MYTAG"> 
     <h3> 
      <xsl:value-of select="@title" /> 
     </h3> 
     <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet>