2

我有以下两个XSDS,test.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"    
  xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
  xmlns:ns1="http://www.test.com/ns1"     
  targetNamespace="http://www.test.com" 
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">
    <import namespace="http://www.test.com/ns1" schemaLocation="test1.xsd"/>
    <element name="Root">
        <complexType>
            <sequence>
                <element name="Child" type="string"/>
            </sequence>
            <attribute ref="ns1:myAttrib1" use="required"/>
            <attribute ref="ns1:myAttrib2" use="required"/>
        </complexType>
    </element>
</schema>

和 test1.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
  xmlns:ns1="http://www.test.com/ns1" 
  targetNamespace="http://www.test.com/ns1" 
  elementFormDefault="qualified" attributeFormDefault="unqualified">
    <attribute name="myAttrib1" type="string"/>
    <attribute name="myAttrib2" type="string"/>
</schema>

实例文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>

现在,使用 Xerces 2.11.0,我必须为属性添加前缀myAttrib1myAttrib2使用ns1它才能通过验证。起初我觉得这不符合模式定义(由于attributeFormDefault="unqualified"in ns1),但再考虑一下它是有道理的。我是这样理解的:前缀是必要的,因为属性myAttrib1myAttrib2没有在targetNamespace使用它们的默认命名空间,即它们没有在xmlns="http://www.test.com".

这是我的问题:1)我是否正确理解了前缀所述属性的必要性,以及 2)在 W3C 建议中的位置。我可以找到描述这种行为的段落吗?谢谢。:)

更新:我遇到了以下段落

最后两个属性(elementFormDefault 和attributeFormDefault)是 W3C XML Schema 提供的一种工具,用于在单个模式中控制属性和元素是否默认被认为是合格的(在命名空间中)。如上所述,可以通过指定默认值来指示合格和不合格之间的这种区别,但也可以在定义元素和属性时,通过添加值合格或不合格的表单属性来指示。

需要注意的是,只有本地元素和属性可以指定为不合格。所有全局定义的元素和属性必须始终是合格的。

xml.com上找到。另一个有趣的来源是zvon.org。因此,这确实支持了公认的答案。但是,我还没有看到(臭名昭著的神秘)W3C rec 的确切位置。详细提到了这一点。毕竟,他们是这个问题的管理机构。

4

2 回答 2

2

架构中的顶级元素和属性声明始终位于架构的 targetNamespace 中。elementFormDefault和仅适用于嵌套在复杂类型内的attributeFormDefault匿名元素/属性声明。如果您的test.xsd架构未指定elementFormDefault="qualified",则Child复杂类型内的元素将不在命名空间中,并且实例文档需要看起来像

<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns:ns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>

此外,命名空间中的属性必须加前缀——默认xmlns="..."命名空间声明仅适用于元素。因此

<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns="http://www.test.com/nl1" xmlns:ns="http://www.test.com" 
  myAttrib1="1" myAttrib2="2">
    <ns:Child>Child 1</ns:Child>
</ns:Root>

无效- myAttrib1 和 myAttrib2 不在命名空间中。

于 2012-11-06T12:27:11.637 回答
1

1) 正确。但是,attributeFormDefaultandelementFormDefault仅适用于本地定义的属性和元素。换句话说,那些不是schemaredefine的直接子级的,嵌套在其他 schema 组件中。

2)第 3.2 .2 节显示 ref 必须是 QName。通常,在 XSD 中的任何地方都可以看到 ref 属性,它是 QName 类型。

于 2012-11-06T12:27:53.093 回答