1

我正在实现一个符合两个外部提供的 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>

和 ns2.xsd:

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

liquid-technologies.com上有一个教程展示了如何实现使用引用类型的XSD。按照这个逻辑,我得到:

<?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>

使用 Xerces 2.11.0 进行验证。如果我attributeFormDefault="unqualified"在 ns2.xsd 中进行更改,我必须在实现中删除命名空间前缀以使其验证:

<?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>

正如我刚才问的那样,field3(正确地)仍然是前缀。现在我想知道:

  1. field1field2对比的真正区别是什么field3?为什么 Xceres 强迫我省略field1and的前缀field2?是因为field1并且field2确实是类型的一部分,field3而是对属性的引用?
  2. 在第二种情况下,接收者如何知道命名空间属性field1field2所属?

(如果有人知道描述这些规则的 W3C 建议的哪一部分,我也会非常感激。)

附加信息

我很想指出这个例子的后果。在案例 1中field1,以 whichfield2为前缀ns2清楚地将它们确定为ns2-namespace 中的属性名称。ns1在情况 2 中,上述两个属性名称都没有前缀,除了这些属性属于默认 ( ) 命名空间之外,很难得出任何其他结论。

为什么这很重要?好吧,这很重要,因为它已经有效地变成attributeFormDefault了命名空间限定符。我很难理解这是 W3C 委员会的意图,因此我认为这是一个错误。如果有人能启发我,我会很激动!

4

1 回答 1

1

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

当您说 attributeFormDefault="unqualified" 时,ns2 架构文档中本地声明的属性将不在命名空间中,这意味着它们必须出现在没有前缀的实例中。

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

于 2013-02-18T12:45:59.697 回答