XML Schema多重导入效果

时间:2015-11-22 04:51:18

标签: xsd xsd-validation

在查看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>

0 个答案:

没有答案