XML 属性在 *value* 中有前缀 - 如何判断它是命名空间前缀?

XML attribute with a prefix in *value* - how to tell it is a namespace prefix?

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

Update/Solution:

感谢以下答案中提供的有用解释和指示,我修改了我的代码,使其在遇到具有前缀值的属性时按以下规则工作:

任何感兴趣的人,the code is here

我知道可以通过不只触及受模糊属性影响的命名空间来改进逻辑,但这对我来说已经足够好了。

如果不了解应用程序对 XML 的解释,这不可能以通用方式实现。但是,有一个弱约定,如果所讨论的属性或元素具有 xsd:QName 的 XML 模式数据类型(因此,所讨论的 XML 必须由 XML 模式),然后属性或元素的值受命名空间规范化的约束。

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

模式会告诉您属性的类型是否为 xs:QName,但它不会告诉您它是名称空间敏感的 XPath 表达式(例如 XSLT 中的 xsl:value-of/@select 或 [= XSD 中的 12=])。即使您知道这些属性对名称空间敏感,您也需要进行大量详细的解析才能提取和替换名称空间前缀。

所以即使有模式,在一般情况下也无法完成任务。

很遗憾,您不是第一个 运行 解决此问题的人。定义 XPath 使用的数据模型总是受到 QNames-in-content(或更一般地说,prefixes-in-content)问题的困扰。