我已经看过这个资源link text,但我仍然无法使用MSXML解析器生成有效的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中我有代码进行相关转换:
<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代码中加入了令人讨厌的xmlns:
<h1 xmlns="http://www.w3.org/1999/xhtml">BLA BLA</h1>
我哪里出错?
请注意:我必须使用拉模型进行转换,我不能使用标识转换
答案 0 :(得分: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:stylesheet元素上你想要创建XHTML元素。
答案 1 :(得分: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>
答案 2 :(得分: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-copy用于发布的第一个代码段
<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="">
希望很清楚。