理解特定XSD验证结果时遇到问题(Xceres)
我正在实施符合两个外部提供的XSD的XML解决方案。首先,我们ns1.xsd:理解特定XSD验证结果时遇到问题(Xceres)
<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有一个tutorial showing how XSDs using referenced types应予执行。遵循该逻辑,我得到:
<?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验证。如果我在ns2.xsd改变attributeFormDefault="unqualified"
我不得不放弃了实施中的命名空间前缀得到它来验证:
<?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>
正如我asked a while back,field3
是(正确地)仍然前缀。现在我不知道:
- 是什么对比
field3
field1
和field2
之间真正的区别?为什么Xceres强迫我省略field1
和field2
的前缀?这是否因为field1
和field2
确实属于某种类型,而field3
是对某个属性的引用? - 接收方在第二种情况下如何确定属性
field1
和field2
属于哪个名称空间属性?
(如果有人知道这是什么描述这些规则的W3C区域经济共同体的一部分,我是真的太感激。)
其他信息
我感到一种冲动指出这个例子的后果。如果1 field1
和field2
的前缀为ns2
,则明确将它们确定为ns2
-名称空间中的属性名称。在情况2中,在没有任何所述属性名称被加前缀的情况下,除了这些属性属于默认(ns1
)命名空间之外,很难得出任何其他结论。
这是为什么?那么,这很重要,因为它有效地将attributeFormDefault
转换为名称空间限定符。我有严重的问题了解W3C委员会的意图,因此我认为它是一个错误。如果有人能够启发我,我会很高兴!
未加前缀的属性通常被视为不在名称空间中。它们不在默认名称空间中。 (我通常说,因为有些人喜欢不同的解释,就像他们在一个未指定的名称空间,但这种区别对我来说太微妙了。)
当你说attributeFormDefault =“unqualified”,local- ns2的模式文档中声明的属性将不在名称空间中,这意味着它们必须出现在没有前缀的实例中。
至于ns2:field3,这有点奇怪,因为似乎没有对该属性的声明。但是如果有的话,它必须是一个全局属性声明,并且全局属性总是进入包含模式文档的目标名称空间。
感谢您分享您的见解!我的错误不包括缺少ns2:field3声明。我现在添加了它。其实,我确实看到http://stackoverflow.com/questions/8903768/unqualified-xsd-global-attribute-references帖子,但没有意识到它的后果。所以我猜想(元素|属性)FormDefault(从某种意义上)隐式地控制名称空间所属的结论毕竟是正确的? – conciliator 2013-02-18 13:49:59
编辑:elementFormDefault没有这种效果,因为非前缀元素最终在默认名称空间中。我在解释以下内容时也遇到了一些麻烦:“默认名称空间声明适用于其作用域内的所有无前缀的元素名称_默认名称空间声明不直接应用于属性名称;前缀属性的解释取决于它们所在的元素出现_。” (http://www.w3.org/TR/REC-xml-names/#defaulting,我的重点)。 – conciliator 2013-02-18 14:19:08
[旁边问题]“不知道在任何特定命名空间”和“已知不在任何命名空间”之间的区别对我来说似乎并不精妙。不知道X是否结婚,或者不知道X的薪水是多少,与X不结婚或X根本没有薪水完全不同。诚然,Namespaces规范并没有为此提供很好的术语;这就是为什么有些人喜欢谈论合格和不合格的名字,这意味着扩展形式具有非空或空名称空间值的Qnames。 – 2013-02-18 19:30:30