我正在编写一个代码,用任意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。
我知道可以通过不仅仅触及受歧义属性影响的名称空间来改进逻辑,但对我来说它是足够好的(tm)。
如果不了解应用程序对XML的解释,则无法以通用方式实现这一点。但是,如果所讨论的属性或元素具有xsd:QName
的XML Schema数据类型(因此所讨论的XML必须首先由XML Schema描述),则会有一个弱约定,那么属性或元素的值是主题命名空间规范化。
另见Using Qualified Names (QNames) as Identifiers in XML Content。
模式将告诉您属性是否被键入为xs:QName
,但它不会告诉您它是名称空间敏感的XPath表达式(例如XSL中的xsl:value-of/@select
或XSD中的xs:selector/@xpath
)。即使您知道这些属性是名称空间敏感的,您也需要进行大量详细的解析来提取和替换名称空间前缀。
因此,即使使用模式,在一般情况下也无法完成任务。
不幸的是,你不是第一个遇到这个问题的人。定义XPath使用的数据模型总是受到内容中QNames(或更一般地说,内容中的前缀)问题的困扰。