通过两个模式验证的XML文件

时间:2019-11-18 22:32:31

标签: xml xsd xsd-validation

我想创建一个XML文件,该文件应通过两种模式(一种导入另一种)进行验证:

<bbb:Order xmlns:bbb="http://NamespaceTest.com/BBB" xmlns:aaa="http://NamespaceTest.com/AAA">
  <aaa:Customer>
    <aaa:Name>string</aaa:Name>
    <aaa:DeliveryAddress>string</aaa:DeliveryAddress>
    <aaa:BillingAddress>string</aaa:BillingAddress>
  </aaa:Customer>
</bbb:Order>

为此,我创建了两个模式。第一个看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://NamespaceTest.com/AAA"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://NamespaceTest.com/AAA"
           elementFormDefault="qualified">
    <xs:element name="Customer" type="CustomerType">
    </xs:element>
    <xs:complexType name="CustomerType">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" />
            <xs:element name="DeliveryAddress" type="xs:string" />
            <xs:element name="BillingAddress" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

然后我将此文件导入第二个模式:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://NamespaceTest.com/BBB"
           xmlns:aa="http://NamespaceTest.com/AAA" targetNamespace="http://NamespaceTest.com/BBB"
           elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:import schemaLocation="aaa.xsd" namespace="http://NamespaceTest.com/AAA"/>
    <xs:element name="Order">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Customer" type="aa:CustomerType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

使用这种模式时,必须从名称空间http://NamespaceTest.com/BBB引用XML文件中的元素Customer,但是我希望从http://NamespaceTest.com/AAA(定义了类型)引用它。应该如何更改模式,以便我可以像问题开头那样使用XML?

1 个答案:

答案 0 :(得分:1)

当您应引用全局元素bbb:Customer时,已定义了本地元素aaa:Customer。应该是

<xs:complexType>
    <xs:sequence>
        <xs:element ref="aa:Customer"/>
    </xs:sequence>
</xs:complexType>

偶然地(很多人误解了术语,你并不孤单),这里有一个模式,由两个模式文档组成。