我有以下两个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,我必须为属性添加前缀myAttrib1
并myAttrib2
使用ns1
它才能通过验证。起初我觉得这不符合模式定义(由于attributeFormDefault="unqualified"
in ns1
),但再考虑一下它是有道理的。我是这样理解的:前缀是必要的,因为属性myAttrib1
并myAttrib2
没有在使用它们的默认命名空间,即它们没有在targetNamespace
xmlns="http://www.test.com"
.
这是我的问题:1)我是否正确理解了前缀所述属性的必要性,以及 2)在 W3C 建议中的位置。我可以找到描述这种行为的段落吗?谢谢。:)
更新:我遇到了以下段落
最后两个属性(elementFormDefault 和attributeFormDefault)是 W3C XML Schema 提供的一种工具,用于在单个模式中控制属性和元素是否默认被认为是合格的(在命名空间中)。如上所述,可以通过指定默认值来指示合格和不合格之间的这种区别,但也可以在定义元素和属性时,通过添加值合格或不合格的表单属性来指示。
需要注意的是,只有本地元素和属性可以指定为不合格。所有全局定义的元素和属性必须始终是合格的。
在xml.com上找到。另一个有趣的来源是zvon.org。因此,这确实支持了公认的答案。但是,我还没有看到(臭名昭著的神秘)W3C rec 的确切位置。详细提到了这一点。毕竟,他们是这个问题的管理机构。