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:
感谢以下答案中提供的有用解释和指示,我修改了我的代码,使其在遇到具有前缀值的属性时按以下规则工作:
- 对于 xsi:type 属性,更新属性值的前缀以匹配
http://www.w3.org/2001/XMLSchema 的新前缀。
- 如果在当前上下文中没有具有匹配前缀的命名空间,
该值被视为文字(不是 QName)并保持原样。
- 如果在当前
context 有一个带有匹配前缀的命名空间,我们无法判断
如果属性值是文字或 QName,那么代码取消
处理并按原样保留文档。该文档不是
完全修改。
任何感兴趣的人,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)问题的困扰。
我正在编写一个代码,以任意 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:
感谢以下答案中提供的有用解释和指示,我修改了我的代码,使其在遇到具有前缀值的属性时按以下规则工作:
- 对于 xsi:type 属性,更新属性值的前缀以匹配 http://www.w3.org/2001/XMLSchema 的新前缀。
- 如果在当前上下文中没有具有匹配前缀的命名空间,
该值被视为文字(不是 QName)并保持原样。 - 如果在当前 context 有一个带有匹配前缀的命名空间,我们无法判断 如果属性值是文字或 QName,那么代码取消 处理并按原样保留文档。该文档不是 完全修改。
任何感兴趣的人,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)问题的困扰。