xsd选择覆盖

时间:2012-04-20 19:12:24

标签: xsd polymorphism abstract choice

我需要定义一组XSD。每个XSD都有一个标题元素,除了中间的一些元素外,该标题是相同的。

所以,我会:

XML1:

<req1>
    <head>
        <common1/>
        <common2/>
        <choice1/>
        <choice2/>
        <common3/>
    </head>
    <data1>...</data1>
</req1>

XML2:

<req2>
    <head>
        <common1/>
        <common2/>
        <choice2/>
        <choice3/>
        <common3/>
    </head>
    <data2>...</data2>
</req2>

其中choice1,choice2,choice3在<choice>集合中,如

<choice>
    <choice2/>
    <choice3/>
</choice>

并且可以在不同的请求类型之间具有不同的选择和数量的元素。

我真的希望能够在单个XSD中为标头定义它,然后在req1.xsd和req2.xsd中包含它。我无法弄清楚如何动态地交换此<choice>。如果我没有<common3/>部分,我可以使用一个基本元素,但我的理解是,当我向基础添加任何东西时,它只会在最后添加。我可以在中间替换任何方式,或者在使用基础时添加到中间?

1 个答案:

答案 0 :(得分:3)

一种方法是使用替代组。您可以为样板定义基础XSD。

Base.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/XML Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="head">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="common1" type="xsd:anyType"/>
                <xsd:element name="common2" type="xsd:anyType"/>
                <xsd:element ref="headerPlaceholder"/>
                <xsd:element name="common3" type="xsd:anyType"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="headerPlaceholder" type="headerPlaceholder" abstract="true"/>
    <xsd:complexType name="headerPlaceholder" abstract="true"/>
    <xsd:complexType name="request" abstract="true">
        <xsd:sequence>
            <xsd:element ref="head"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

然后你可以独立构建你的req1和req。

Req1.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/XML Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="SubstitutionGroupHeader.xsd"/>

    <xsd:element name="req1" type="req1"/>
    <xsd:complexType name="req1">
        <xsd:complexContent>
            <xsd:extension base="request">
                <xsd:sequence>
                    <xsd:element name="data1"/>
                </xsd:sequence>         
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="choice1" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="choice2" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

结构如下:

Req 1

Req2.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/XML Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="SubstitutionGroupHeader.xsd"/>

    <xsd:element name="req2" type="req2"/>
    <xsd:complexType name="req2">
        <xsd:complexContent>
            <xsd:extension base="request">
                <xsd:sequence>
                    <xsd:element name="data2"/>
                </xsd:sequence>         
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="choice3" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="choice4" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

req2的结构:

req 2

我将select1 / 2和choice3 / 4放在req1和req2中只是为了在内容之间没有重叠。所以文件结构看起来像这样:

XSD File relationships

XSD组件之间的整体关系:

QTAssistant XSD component relationships diagram

如果你想从req1和req2引用相同的choice2,你必须在自己的文件中重构choice2等。

关于选择与替代组的讨论很多,但这是另一回事......