在.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
答案 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"
。
答案 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