理解特定XSD验证结果时遇到问题(Xceres)

理解特定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 backfield3是(正确地)仍然前缀。现在我不知道:

  1. 是什么对比field3field1field2之间真正的区别?为什么Xceres强迫我省略field1field2的前缀?这是否因为field1field2确实属于某种类型,而field3是对某个属性的引用?
  2. 接收方在第二种情况下如何确定属性field1field2属于哪个名称空间属性?

(如果有人知道这是什么描述这些规则的W3C区域经济共同体的一部分,我是真的太感激。)

其他信息

我感到一种冲动指出这个例子的后果。如果1 field1field2的前缀为ns2,则明确将它们确定为ns2-名称空间中的属性名称。在情况2中,在没有任何所述属性名称被加前缀的情况下,除了这些属性属于默认(ns1)命名空间之外,很难得出任何其他结论。

这是为什么?那么,这很重要,因为它有效地将attributeFormDefault转换为名称空间限定符。我有严重的问题了解W3C委员会的意图,因此我认为它是一个错误。如果有人能够启发我,我会很高兴!

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

当你说attributeFormDefault =“unqualified”,local- ns2的模式文档中声明的属性将不在名称空间中,这意味着它们必须出现在没有前缀的实例中。

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

+0

感谢您分享您的见解!我的错误不包括缺少ns2:field3声明。我现在添加了它。其实,我确实看到http://stackoverflow.com/questions/8903768/unqualified-xsd-global-attribute-references帖子,但没有意识到它的后果。所以我猜想(元素|属性)FormDefault(从某种意义上)隐式地控制名称空间所属的结论毕竟是正确的? – conciliator 2013-02-18 13:49:59

+0

编辑:elementFormDefault没有这种效果,因为非前缀元素最终在默认名称空间中。我在解释以下内容时也遇到了一些麻烦:“默认名称空间声明适用于其作用域内的所有无前缀的元素名称_默认名称空间声明不直接应用于属性名称;前缀属性的解释取决于它们所在的元素出现_。” (http://www.w3.org/TR/REC-xml-names/#defaulting,我的重点)。 – conciliator 2013-02-18 14:19:08

+0

[旁边问题]“不知道在任何特定命名空间”和“已知不在任何命名空间”之间的区别对我来说似乎并不精妙。不知道X是否结婚,或者不知道X的薪水是多少,与X不结婚或X根本没有薪水完全不同。诚然,Namespaces规范并没有为此提供很好的术语;这就是为什么有些人喜欢谈论合格和不合格的名字,这意味着扩展形式具有非空或空名称空间值的Qnames。 – 2013-02-18 19:30:30