为什么XML Schema允许QName是元素的值?

时间:2012-02-22 13:00:29

标签: xml soap xsd xml-namespaces

How do I find all text nodes in an XML document with a namespace using XPath?中,SO用户断言XML文档中的文本节点不能进行名称空间限定。 XPath 1.0 specthis doc on QNames同意他们的断言。

OTOH,请考虑这个XML

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

这个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>

它声明Hello属于QName类型。如果从XML文档中删除了http://www.bob.com命名空间,则它将无法验证。

想要看到这样做的真实世界示例吗? faultcodes in the SOAP 1.2 spec是我遇到过的。

所以这是我的问题:

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

1 个答案:

答案 0 :(得分:3)

你是混乱的概念。

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

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

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