我正在实现一个符合两个外部提供的 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
(正确地)仍然是前缀。现在我想知道:
field1
和field2
对比的真正区别是什么field3
?为什么 Xceres 强迫我省略field1
and的前缀field2
?是因为field1
并且field2
确实是类型的一部分,field3
而是对属性的引用?- 在第二种情况下,接收者如何知道命名空间属性
field1
和field2
所属?
(如果有人知道描述这些规则的 W3C 建议的哪一部分,我也会非常感激。)
附加信息
我很想指出这个例子的后果。在案例 1中field1
,以 whichfield2
为前缀ns2
清楚地将它们确定为ns2
-namespace 中的属性名称。ns1
在情况 2 中,上述两个属性名称都没有前缀,除了这些属性属于默认 ( ) 命名空间之外,很难得出任何其他结论。
为什么这很重要?好吧,这很重要,因为它已经有效地变成attributeFormDefault
了命名空间限定符。我很难理解这是 W3C 委员会的意图,因此我认为这是一个错误。如果有人能启发我,我会很激动!