前缀为* value *的XML属性 - 如何判断它是名称空间前缀?

时间:2018-05-08 13:24:04

标签: java xml xml-namespaces xml-attribute

我正在编写一个代码,用任意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。

更新/溶液

由于下面的答案中提供了有用的解释和指示,我在遇到具有前缀值的属性时,已修改我的代码以遵循以下规则:

  • 对于xsi:type属性,更新属性值的前缀以匹配 http://www.w3.org/2001/XMLSchema的新前缀。
  • 如果在当前上下文中没有带有匹配前缀的命名空间,则为 该值被视为文字(不是QName)并保持原样。
  • 如果在当前 上下文中有一个带有匹配前缀的命名空间,我们无法分辨 如果属性值是文字或QName,那么代码取消了 处理并保留文档。该文件不是 完全修改过。

对于任何有兴趣的人,the code is here

我知道可以通过不仅仅触及受歧义属性影响的名称空间来改进逻辑,但对我来说它是足够好的(.mm)。

2 个答案:

答案 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/@selectxs:selector/@xpath在XSD中)。即使您知道这些属性对名称空间敏感,您也需要进行大量详细的解析来提取和替换名称空间前缀。

因此,即使使用模式,在一般情况下也无法完成任务。

不幸的是,你不是第一个遇到这个问题的人。定义XPath使用的数据模型总是受到内容中QNames(或更一般地说,内容中的前缀)问题的困扰。