2

我已经看到了这个资源链接文本,但我仍然无法使用 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>

我哪里错了?

请注意:我必须使用拉模型进行转换,我不能使用身份转换

4

3 回答 3

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 元素。

于 2010-03-09T12:30:36.767 回答
1

如果您将 xmlns="http://www.w3.org/1999/xhtml" 放在 'html' 元素上,则它适用于该元素及其所有(非限定)后代元素。'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>
于 2010-03-10T11:34:49.757 回答
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="">

希望是明确的。

于 2010-03-10T07:42:43.507 回答