【问题标题】:xml to xhtml: empty namespace attribute added (xslt 2.0, saxon9he)xml 到 xhtml:添加了空的命名空间属性(xslt 2.0,saxon9he)
【发布时间】:2015-11-28 11:18:53
【问题描述】:

我正在尝试使用 xslt 2.0 将 xml 转换为 xhtml。

我正在为某些元素创建单独的文档,如下所示:

<xsl:result-document method="xhtml" href="output/{generate-id()}.html" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="utf-8" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title>
                <xsl:value-of select="$title"/>
            </title>
            <link rel="stylesheet" type="text/css" href="styles.css"/>
        </head>
        <body>
            <div id="{generate-id()}">
                <xsl:apply-templates/>
            </div>
        </body>
    </html>
</xsl:result-document>

不过,我在命名空间方面遇到了问题。一些创建的文档如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title/>
        <link rel="stylesheet" type="text/css" href="styles.css" />
    </head>
    <body>
        <div id="d1e1203">

            <img xmlns="" src="file:/P:/199/199201.tif" alt=""/>

            <h1 xmlns="">gfdg</h1>

            <h1 xmlns="">gfdg</h1>

            <img xmlns="" src="file:/P:/124/124566.tif" alt="gdf"/>
<!-- and so on -->

为什么在一些html的后代中添加了xmlns=""?

如果我这样说:

<xsl:result-document method="xhtml" href="output/{generate-id()}.html" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="utf-8" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
        <html>

然后不会添加空的命名空间属性。但是,当我转换其中一个文档时,出现以下错误:

Warning: SXXP0005: The source document is in namespace http://www.w3.org/1999/xhtml, but all the
  template rules match elements in no namespace (Use --suppressXsltNamespaceCheck:on to
  avoid this warning)

如何正确处理命名空间?

【问题讨论】:

  • 您没有提供reproducible example。一般来说,如果你复制一个没有命名空间的元素,那么它会按照你显示的方式出现,以便与&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;建立的默认命名空间区分开来。
  • 好吧,我并没有真正复制任何东西。我只想创建 xhtml 文档。为此,据我了解,html-Tag 需要具有 xhtml 命名空间,而我需要 xhtml Doctype。我的示例代码中缺少什么?
  • "我的示例代码中缺少什么?" (a) 输入; (b) 上下文(你的模板匹配什么?); (c) 创建img 和h1 元素的部分(样式表中的其他模板?)。 请查看我第一条评论中的链接。

标签: xml xslt xhtml


【解决方案1】:

如果您使用不同的模板来创建 XHTML 结果元素,那么您需要将 xmlns="http://www.w3.org/1999/xhtml" 移动到样式表的 xsl:stylesheet(分别为 xsl:transform)根元素,例如&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0"&gt;.

至于编写处理(读入)XHTML 文档的样式表,其中包含 XHTML 命名空间中的元素,对于 XSLT 2.0,最简单的方法是在 xsl:stylesheet 元素上使用 xpath-default-namespace="http://www.w3.org/1999/xhtml",这样您就可以编写像 @987654327 这样的匹配模式@ 和 XPath 表达式如 //table 分别匹配选择 XHTML 命名空间中的元素,没有 XPath/XSLT 1.0 需要将前缀绑定到命名空间并在所有模式和表达式中使用前缀。

【讨论】:

  • 但这假设您希望所有结果都是 XHTML。
  • 是的,但是“我正在尝试将 xml 转换为 xhtml”听起来就是这种情况,如果不是,模板可以做例如&lt;xsl:template match="foo" xmlns=""&gt;&lt;bar&gt;...&lt;/bar&lt;/xsl:template&gt; 覆盖命名空间声明。
  • 是的,就是这样!我希望我的所有结果都是 xhtml!
【解决方案2】:

如果 Saxon 输出 &lt;img xmlns=""/&gt;,那是因为您的结果树在任何命名空间中都包含一个 img 元素,并且某些祖先元素位于诸如 XHTML 命名空间之类的命名空间中。为避免不必要的命名空间未声明,您需要确保结果树中的 img 元素是在正确的命名空间中创建的。您没有显示生成img 元素的代码,但最常见的错误是在样式表中使用&lt;img/&gt; 形式的文字结果元素,而没有在范围内声明默认命名空间。解决此问题的最佳方法通常是在 xsl:stylesheet 元素上声明 XHTML 命名空间,而不是在输出 html 元素的指令上。

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多