2010-03-09 272 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>