xml到xhtml:添加了空命名空间属性(xslt 2.0,saxon9he)

时间:2015-11-28 11:18:54

标签: xml xslt xhtml

我正在尝试使用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 -->

为什么xmlns=""被添加到html的某些后代?

如果我这样说的话:

<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)

如何正确处理命名空间?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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