为什么 XML 模式允许 QName 作为元素的值?

发布于 2025-01-08 09:05:26 字数 1401 浏览 1 评论 0原文

如何使用 XPath 查找具有命名空间的 XML 文档中的所有文本节点? 中,SO 用户断言XML 文档不能是命名空间限定的。 XPath 1.0 规范此关于 QName 的文档 同意他们的主张。

OTOH,考虑这个 XML

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:bob="http://www.bob.com">
    <Hello>bob:World</Hello>
</Root>

和这个 XML 架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Hello" type="xs:QName" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

它声明 HelloQName 类型。如果从 XML 文档中删除 http://www.bob.com 命名空间,则不会进行验证。

想看一个真实世界的例子吗? SOAP 1.2 规范中的故障代码 是其中之一我曾经遇到过。

所以我的问题是:

  1. 为什么 XML Schema 允许 QName 作为元素的值?这似乎与其他规范相矛盾。
  2. 公平地说,即使 XML 解析器不理解文本节点是命名空间限定的,但其他处理器(例如模式验证器和 SOAP 处理器)却可以?

In How do I find all text nodes in an XML document with a namespace using XPath?, SO users asserted that text nodes in an XML document cannot be namespace qualified. The XPath 1.0 spec and this doc on QNames agree with their assertions.

OTOH, consider this XML

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:bob="http://www.bob.com">
    <Hello>bob:World</Hello>
</Root>

And this XML Schema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Hello" type="xs:QName" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

It declares Hello to be of type QName. If the http://www.bob.com namespace is removed from the XML document, it won't validate.

Want to see a real world example that does this? The faultcodes in the SOAP 1.2 spec are one that I've run across.

So here's my questions:

  1. Why does XML Schema allow a QName to be the value of an element? It seems that this contradicts other specs.
  2. Is it fair to say that even though XML parsers do not understand a text node to be namespace qualified, other processors, such as schema validators and SOAP processors, do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你是年少的欢喜 2025-01-15 09:05:26

你混淆了概念。

元素和属性都有名称,并且它们的名称可以是命名空间限定的。文本节点没有名称,因此它们的名称显然不能是命名空间限定的。

属性和文本节点都可以将 QName 作为其内容。这两种情况下的命名空间前缀都是根据包含元素的范围内命名空间进行解析的:即在元素及其祖先上声明的所有命名空间。这与所讨论的元素或属性的名称完全无关。

然而,您指出元素或属性内容中的 QName 无法由 XML 解析器本身检测到,只能由模式验证器检测,这是正确的。您认为这是一个问题也是正确的。然而,规格之间并不矛盾。这完全符合以下事实:XML 解析器无法识别节点包含数字或日期,但模式验证器可以。

You are confusing concepts.

Element and attributes have names, and their names can be namespace-qualified. Text nodes do not have names, so their names obviously cannot be namespace-qualified.

Attributes and text nodes can both have QNames as their content. The namespace prefix in both cases is resolved against the in-scope namespaces of the containing element: that is, all the namespaces declared on the element and its ancestors. This is quite unrelated to the name of the element or attribute in question.

You are correct, however, in pointing out that QNames in element or attribute content cannot be detected by the XML parser itself, only by a schema validator. You are also correct to identify this as a problem. It is not, however, a contradiction between the specs. It's entirely consistent with the fact that an XML parser can't recognize that a node contains a number or a date, but a schema validator can.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文