我正在尝试使用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)
如何正确处理命名空间?
答案 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
元素的指令上声明。