排除-结果前缀= “的xmlns”

时间:2011-07-29 08:08:59

标签: java xml xslt

在.net中,以下xslt是正确的。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
exclude-result-prefixes="table xmlns">

但在java中,如果我使用saxon,

exclude-result-prefixes="xmlns"

将生成以下错误:

worksheets.xsl第52行的xsl:stylesheet出错:   XTSE0165:尚未声明命名空间前缀xmlns

3 个答案:

答案 0 :(得分:3)

首先,关于哪种产品是正确的相当干燥的问题。 XSLT 1.0规范说明了排除结果前缀,“如果没有命名空间绑定到带有exclude-result-prefixes或xsl:exclude-result-prefixes属性的元素上的前缀,则会出错。”名称空间前缀对于元素的“绑定”(在范围内)是在XPath数据模型http://www.w3.org/TR/xpath/#namespace-nodes中定义的,如果您仔细阅读它,则会非常仔细地告诉您,前缀“xmlns”没有范围内绑定。 XPath 2.0更明确地说明了这一点:“命名空间节点不能具有名称xmlns,也不能具有字符串值http://www.w3.org/2000/xmlns/。”,但这只是作为澄清而非实质性更改。

现在关于如何实现您想要实现的目标的更有趣的问题。我认为你实际上没有告诉我们你想要实现的目标。一些回复推测,排除结果前缀=“#default”将解决您的问题,但在建议之前,我很想知道您的问题是什么。

答案 1 :(得分:2)

根据XSLT规范,使用#default,例如:exclude-result-prefixes="#default"

参考:http://www.w3.org/TR/xslt#literal-result-element

答案 2 :(得分:0)

在exclude-result-prefixes中包含xmlns是错误的,Xml规范禁止明确声明xmlns命名空间前缀:

  

前缀xmlns仅用于声明命名空间绑定,并且根据定义绑定到命名空间名称http://www.w3.org/2000/xmlns/。它不能被宣布。其他前缀不得绑定到此命名空间名称,并且不得将其声明为默认命名空间。元素名称不能有前缀xmlns。

因此,在exclude-result-prefixes中包含xmlns是没有意义的,因为它不是有效的前缀。有关详细信息,请参阅http://www.w3.org/TR/xml-names/#ns-decl