2010-03-09 54 views
2

我已經看到此資源link text,但我仍然遇到使用MSXML分析器生成有效XHTML文檔的麻煩。XSLT轉換以生成有效的XHTML:命名空間問題

我在輸入下列文件:

<?xml version="1.0" encoding="UTF-8" ?> 
- <html xml:lang="it" xmlns="http://www.w3.org/1999/xhtml"> 
- <head xmlns=""> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>Bla bla bla</title> 
    <link rel="stylesheet" type="text/css" media="screen" href="css/bla.css" /> 
    </head> 
- <body xmlns="" style="background-color:#DFDFDF;left-margin:0;margin-top:0"> 
    .... 
    </body> 
    </html> 

其中討厭的xmlns =「」產生,因爲我已插入指令:

parserInstance.documentElement.setAttribute "xmlns", "http://www.w3.org/1999/xhtml" 
創建相變前的輸入文檔時

的XSLT進口我使用轉型以抓住html元素

<xsl:stylesheet 
    version="1.0" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="xhtml xsl" 
> 
<xsl:import href="_lib.xsl"/> 
<xsl:import href="_standard.xsl"/> 

和_standard.xsl內我有使rerlevant轉換的代碼:

<xsl:template match="html"> 
<xsl:copy> 
    <xsl:copy-of select="@*" /> 
    <xsl:apply-templates select="head" />  
    <xsl:apply-templates select="body" />  
</xsl:copy> 

仍我在html標記中沒有所需的xmlns:

<html xml:lang="it"> 

,我仍然在HTML代碼intersparsed討厭的xmlns:

<h1 xmlns="http://www.w3.org/1999/xhtml">BLA BLA</h1> 

當我收到錯了嗎?

請注意:我必須用拉模型用於轉化,我不能使用恆等變換

回答

3

隨着DOM模型(MSXML使用)的命名空間的元素的或屬性創建時節點被確定,之後不能更改它,並嘗試通過設置名稱爲「xmlns」的屬性來更改名稱空間,而不要更改節點的名稱空間。

因此,聽起來好像您的輸入文檔中沒有名稱空間中的元素,並且希望使用XSLT將它轉換爲XHTML名稱空間中的元素。在這種情況下,您不能使用xsl:copy來獲取沒有名稱空間中的結果元素。相反,你需要

<xsl:template match="html"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    ... 
    </html> 
</xsl:template> 

或當然的,只要你想該命名空間的所有結果的要素,你可以把的xmlns =「http://www.w3.org/1999/xhtml」在xsl:樣式表或CSS樣式表的元素您希望創建XHTML元素的模塊。

+0

完成,但輸出文檔中的某些html元素仍存在xmlns屬性。 – Daniel 2010-03-09 13:55:45

+1

發佈儘可能少但完整的XML輸入示例和您的樣式表讓我們能夠重現問題,然後我相信我們可以解決它。恐怕「某些html元素仍然存在xmlns屬性」不允許我決定它們分別來自哪裏,如何解決這些問題,我需要查看代碼。 – 2010-03-09 14:28:53

0

@Martin:我發佈樣本。對不起,我的評論是通用的。

輸入文檔(最小)

<?xml version="1.0" encoding="UTF-8"?> 
<html xml:lang="it"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<title>Page title</title> 
<link rel="stylesheet" type="text/css" media="screen" href="css/stile.css"/> 
</head> 
<body> 
<div id="errorPanel" class="errorPanel"/> 
<navigation> 

<panel name="navbar"> 
<link> 
<url>resource1.htm</url> 
<label>resource1</label> 
</link> 
</panel> 

<panel name="special"> 
<link> 
<url>resource2.htm</url> 
<label>resource2</label> 
</link> 
</panel> 
</navigation> 

<content/> 

<script type="text/javascript" src="lib/jquery.js"/> 
<script type="text/javascript" src="backend.js"/> 

</body> 
</html> 

然後主要XSL只是內容:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="xsl" 
> 
<xsl:import href="_lib.xsl"/> 
<xsl:import href="_standard.xsl"/> 
<xsl:output 
    method="xml" 
    omit-xml-declaration="no" 
    encoding="UTF-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
/> 

<xsl:template match="content"> 
      <h1>CONTENT</h1> 
      <p> 
       Bla bla bla 
      </p>  
</xsl:template> 
</xsl:stylesheet> 

然後_standard.xsl。注意,該指令:

<xsl:template match="html"> 

暫時使用了xsl拷貝作爲第一代碼片段貼

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

<xsl:template match="html"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select="head" />  
     <xsl:apply-templates select="body" />  
    </html> 
</xsl:template> 

<xsl:template match="head"> 
     <xsl:copy-of select="." /> 
</xsl:template> 

<xsl:template match="body"> 
    <body> 
    <table id='toppanel'> 
     <tr> 
      <td>Bla bla bla</td> 
      <td>Bla bla bla</td> 
      <td>Bla bla bla</td> 
     </tr> 
    </table> 

    <table> 
    <tr> 
     <xsl:apply-templates select="navigation/panel[@name='navbar']" mode="td"/> 
    </tr> 
    </table> 

    <table> 
    <tr> 
     <td> 
       <p>Area</p> 
       <xsl:apply-templates select="navigation/panel[@name='special']" /> 
     </td> 

     <td> 
      <xsl:apply-templates select="content" /> 
     </td> 

    </tr> 
    </table> 
    </body> 
</xsl:template> 

</xsl:stylesheet> 

我在輸出標記發現這樣的:

<body xmlns=""> 

希望很明顯。

1

如果你把'html'元素的xmlns =「http://www.w3.org/1999/xhtml」,那麼它適用於該元素及其所有(不合格)後裔元素。 'body'元素在一個完全不同的模板中,因此您或者需要在body元素上放置一個名稱空間聲明,或者如已經建議的那樣,您只需將xmlns =「http://www.w3.org/1999/xhtml 「樣式表模塊中所有應該創建XHTML元素的xsl:stylesheet元素。

也沒有這樣做或將創建一個輸入節點的副本。由於您的輸入元素在任何名稱空間中都沒有,如果您複製它們中的任何一個,則結果中的副本也將不在名稱空間中,而您希望結果元素位於XHTML名稱空間中。因此,執行xsl:copy或xsl:copy-of將無法滿足您的需求,而需要通過更改名稱空間的模板來運行元素,例如

<xsl:template match=*"> 
    <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template>