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

为什么XML模式允许QName作为元素的值?,xml,soap,xsd,xml-namespaces,Xml,Soap,Xsd,Xml Namespaces,在中,因此用户断言XML文档中的文本节点不能限定命名空间。专家们同意他们的主张 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="

在中,因此用户断言XML文档中的文本节点不能限定命名空间。专家们同意他们的主张

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>

它将
Hello
声明为
QName
类型。如果
http://www.bob.com
命名空间已从XML文档中删除,它将不会验证

想看一个真实世界的例子吗?这是我遇到的一个

下面是我的问题:

  • 为什么XML模式允许QName作为元素的值?这似乎与其他规范相矛盾
  • 公平地说,即使XML解析器不理解文本节点是命名空间限定的,其他处理器,如模式验证器和SOAP处理器,也会这样做吗

  • 你混淆了概念

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

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


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

    感谢您的澄清,Michael。感谢您提出这个问题-我似乎是世界上唯一一个认为这是个问题的人。我遇到的问题是XSLT处理器似乎无法将故障代码解释为QName,因此在XSLT中没有干净的方法在soap 1.1和soap 1.2之间进行转换。您声称找到链接的标记同意“XML文档中的文本节点不能限定命名空间”。但在文件中找不到这种形式的陈述。