Xml 无法理解特定XSD验证结果(Xceres)

Xml 无法理解特定XSD验证结果(Xceres),xml,validation,xsd,xml-namespaces,Xml,Validation,Xsd,Xml Namespaces,我正在实现一个符合两个外部提供的XSD的XML解决方案。首先,我们有ns1.xsd: <schema xmlns:ns1="http://www.test.com/ns1" xmlns:ns2="http://www.test.com/ns2" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" xmlns="http://www.w3.org/2001/XMLSchema"

我正在实现一个符合两个外部提供的XSD的XML解决方案。首先,我们有ns1.xsd:

<schema xmlns:ns1="http://www.test.com/ns1" 
        xmlns:ns2="http://www.test.com/ns2" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.test.com/ns1" 
        elementFormDefault="qualified">
    <import namespace="http://www.test.com/ns2" 
        schemaLocation="http://www.test.com/ns2.xsd"/>
    <element name="Root">
        <complexType>
            <sequence>
                <element name="Child" type="ns2:ChildType" 
                         minOccurs="0"/>
            </sequence>
        </complexType>
        <attribute ref="ns2:field3" use="optional"/>
    </element>
</schema>
与我一样,
field3
仍然(正确地)带有前缀。现在我想知道:

  • field3
    相比,
    field1
    field2
    之间的真正区别是什么?为什么Xceres强迫我省略
    field1
    field2
    的前缀?是因为
    field1
    field2
    实际上是类型的一部分,而
    field3
    是对属性的引用吗
  • 在第二种情况下,接收者如何判断
    field1
    field2
    属于哪些命名空间属性
  • (如果有人知道W3C REC的哪一部分描述了这些规则,我也非常感谢。)

    其他信息

    我迫切需要指出这个例子的后果。在案例1中,
    field1
    field2
    的前缀是
    ns2
    ,这清楚地将它们建立为
    ns2
    命名空间中的属性名称。在案例2中,如果所述属性名称都没有前缀,则很难得出任何其他结论,除非这些属性属于默认(
    ns1
    )命名空间


    为什么这很重要?这很重要,因为它有效地将
    attributeFormDefault
    转换为名称空间限定符。我很难理解W3C委员会的意图是什么,因此我认为这是一个错误。如果有人能启发我,我会很激动的

    没有前缀的属性通常被视为不在名称空间中。它们不在默认名称空间中。(我一般说来,是因为有些人喜欢不同的解释,比如他们在一个未指定的名称空间中,但这种区别对我来说太微妙了。)

    当您说attributeFormDefault=“unqualified”时,ns2的模式文档中本地声明的属性将不在名称空间中,这意味着它们必须出现在实例中,而不带前缀


    至于ns2:field3,这有点奇怪,因为似乎没有属性的声明。但如果有,则必须是全局属性声明,并且全局属性始终位于包含模式文档的目标命名空间中

    没有前缀的属性通常被视为不在名称空间中。它们不在默认名称空间中。(我一般说来,是因为有些人喜欢不同的解释,比如他们在一个未指定的名称空间中,但这种区别对我来说太微妙了。)

    当您说attributeFormDefault=“unqualified”时,ns2的模式文档中本地声明的属性将不在名称空间中,这意味着它们必须出现在实例中,而不带前缀


    至于ns2:field3,这有点奇怪,因为似乎没有属性的声明。但如果有,则必须是全局属性声明,并且全局属性始终位于包含模式文档的目标命名空间中

    感谢分享您的见解!我的错误是没有包括丢失的ns2:field3声明。我现在已经添加了它。事实上,我确实看到了这篇文章,但没有意识到它的后果。所以我想,(element | attribute)FormDefault(在某种意义上)隐式控制命名空间归属的结论是正确的?Edit:elementFormDefault没有这种效果,因为没有前缀的元素最终会出现在默认命名空间中。我在解释以下内容时也有点困难:“默认名称空间声明适用于其范围内所有未固定的元素名称。默认名称空间声明不直接适用于属性名称;未固定属性的解释取决于它们出现的元素。”(,我的重点)。[旁白。]“不在任何特定名称空间中”和“不在任何名称空间中”之间的区别对我来说似乎并不微妙。不知道X是否结婚,或者不知道X的薪水是多少,与知道X没有结婚或者X根本没有薪水是完全不同的。诚然,名称空间规范没有为此提供很好的术语;这就是为什么有些人喜欢谈论限定名和非限定名,这意味着Qnames的扩展形式具有非null或null名称空间值。基本规范所说的是,它们不会定义非固定属性所在的名称空间,这取决于应用程序。这是一个委员会的折衷方案(我们不能同意,所以我们将把它留给用户)。实现的作用,以及大多数处理规范(如XSLT和XQuery)所说的,是不固定的属性被表示为不在任何名称空间中。参见?你一点也不觉得这种区别太微妙。你只是不太喜欢:)谢谢分享你的见解!我的错误是没有包括丢失的ns2:field3声明。我现在已经添加了它。事实上,我确实看到了这篇文章,但没有意识到它的后果。所以我想,(element | attribute)FormDefault(在某种意义上)隐式控制命名空间归属的结论是正确的?Edit:elementFormDefault没有这种效果,因为没有前缀的元素最终会出现在默认命名空间中。我在解释以下内容时也有点困难:“默认名称空间声明适用于其范围内所有未固定的元素名称。默认名称空间声明不直接适用于属性名称;未固定属性的解释取决于它们出现的元素。”(,我的重点)。[旁白。]“不在任何特定名称空间中”和“不在任何名称空间中”之间的区别对我来说似乎并不微妙。不知道X是否结婚,或者不知道X的薪水是多少,这些都不是问题
    <schema xmlns:ns2="http://www.test.com/ns2" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.test.com/ns2" elementFormDefault="qualified" attributeFormDefault="qualified">
        <complexType name="ChildType">
            <attribute name="field1" type="string" use="optional"/>
            <attribute name="field2" type="string" use="optional"/>
        </complexType>
        <attribute name="field3" type="string"/>
    </schema>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Root xmlns="http://www.test.com/ns1" 
          xmlns:ns2="http://www.test.com/ns2" 
          ns2:field3="test">
        <Child ns2:field1="test" ns2:field2="test"/>
    </Root>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Root xmlns="http://www.test.com/ns1" 
          xmlns:ns2="http://www.test.com/ns2" 
          ns2:field3="test">
        <Child field1="test" field2="test"/>
    </Root>