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

问题描述 投票:0回答:2

我正在编写一个代码,用任意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的新前缀。
  • 如果在当前上下文中没有带有匹配前缀的NO命名空间, 该值被视为文字(不是QName)并保持原样。
  • 如果在当前上下文中存在具有匹配前缀的命名空间,则无法判断属性值是文字还是QName,因此代码取消处理并使文档保持原样。该文件根本没有修改。

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

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

java xml xml-namespaces xml-attribute
2个回答
3
投票

如果不了解应用程序对XML的解释,则无法以通用方式实现这一点。但是,如果所讨论的属性或元素具有xsd:QName的XML Schema数据类型(因此所讨论的XML必须首先由XML Schema描述),则会有一个弱约定,那么属性或元素的值是主题命名空间规范化。

另见Using Qualified Names (QNames) as Identifiers in XML Content


2
投票

模式将告诉您属性是否被键入为xs:QName,但它不会告诉您它是名称空间敏感的XPath表达式(例如XSL中的xsl:value-of/@select或XSD中的xs:selector/@xpath)。即使您知道这些属性是名称空间敏感的,您也需要进行大量详细的解析来提取和替换名称空间前缀。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.