我正在编写一个代码,用任意XML重新组织命名空间,可能会改变它们的前缀。在我遇到xsi:type属性之前,这非常简单:
<foo xsi:type="xs:string">...</foo>
如果我更改XSD名称空间的xs前缀,我必须对此xsi:type值执行相同操作,例如成
<foo i:type="x:string">...</foo>
这个属性众所周知。但是,一般来说,如果我找到这样的代码:
<foo xmlns:aaa="http://bbb">
<bar name="aaa:123">...</bar>
</foo>
有没有办法告诉“aaa:123”值,“aaa”部分是指“http://bbb”命名空间?
即。可能是名称只是“aaa:123”,没有任何意图引用带有“aaa”前缀的命名空间,并且匹配是偶然的。
如果有帮助,那么实现语言就是Java。
更新/溶液:
由于下面的答案中提供了有用的解释和指示,我在遇到具有前缀值的属性时,已修改我的代码以遵循以下规则:
对于任何有兴趣的人,the code is here。
我知道可以通过不仅仅触及受歧义属性影响的名称空间来改进逻辑,但对我来说它是足够好的(.mm)。
答案 0 :(得分:3)
在不知道应用程序对XML的解释的情况下,这是不可能的。但是,如果所讨论的属性或元素的XML Schema数据类型为xsd:QName
(因此首先必须由XML Schema描述所涉及的XML),那么会有一个弱约定,那么属性&# 39; s或元素的值受名称空间规范化的影响。
另见Using Qualified Names (QNames) as Identifiers in XML Content。
答案 1 :(得分:2)
模式将告诉您某个属性是否被键入为xs:QName
,但它不会告诉您它是一个名称空间敏感的XPath表达式(例如XSLT中的xsl:value-of/@select
或xs:selector/@xpath
在XSD中)。即使您知道这些属性对名称空间敏感,您也需要进行大量详细的解析来提取和替换名称空间前缀。
因此,即使使用模式,在一般情况下也无法完成任务。
不幸的是,你不是第一个遇到这个问题的人。定义XPath使用的数据模型总是受到内容中QNames(或更一般地说,内容中的前缀)问题的困扰。