在查看XML模式示例时,我看到了以下情况(在xml模式测试套件中,microsoft schema schG1_a / b / c.xsd):
从概念上讲,模式文档A(目标a)导入模式文档B(目标b),后者又导入模式文档C(目标c)。
我对模式规范的解读是A必须直接导入C才能引用C中的任何内容(导入不是传递的)。它不是。这不是问题,因为A本身不引用C中的任何内容,甚至不引用B中的任何内容。它只定义了一个元素' root'这是一系列的任何'来自' ## any'使用processContents' strict'。
的命名空间现在问题是实例文档schG1.xml仅引用模式A,尽管它使用A,B和C中定义的全局元素作为' root'的子项。 A中的元素因为processContents是严格的'模式A应该用于验证实例元素(作为' root'的子元素)。我知道它可以为A和B中定义的元素(直接在A中导入)执行此操作,但我无法理解它如何验证C中的元素,因为它们从未直接在A中看到过。
然而,测试应该是有效的。我相信我一定会错过一些东西......
schG1_a.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="ns-a" xmlns="ns-a">
<xsd:import namespace="ns-b" schemaLocation="schG1_b.xsd"/>
<xsd:element name="e1" type="xsd:int"/>
<xsd:element name="root">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:any namespace="##any" processContents="strict"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
schG1_b.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="ns-b" xmlns="ns-b">
<xsd:import namespace="ns-c" schemaLocation="schG1_c.xsd" />
<xsd:element name="e1" type="xsd:boolean" />
</xsd:schema>
schG1_c.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="ns-c" xmlns="ns-c">
<xsd:element name="e1" type="xsd:string" />
</xsd:schema>
schG1.xml:
<a:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="ns-a schG1_a.xsd"
xmlns:a="ns-a" xmlns:b="ns-b" xmlns:c="ns-c">
<a:e1>123</a:e1>
<b:e1>true</b:e1>
<c:e1>foo</c:e1>
</a:root>