2

我需要定义一组 XSD。每个 XSD 都会有一个 header 元素,并且该 header 是相同的,除了中间的一些元素。

所以,我会:

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/>部分,我可以使用一个基础元素,但我的理解是,当我向基础添加任何东西时,它只会在最后添加。有什么办法可以在中间更换,或者在使用底座时在中间添加?

4

1 回答 1

3

一种方法是使用替换组。您为样板定义了一个基本 XSD。

基础.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 。

请求1.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>

结构如下所示:

要求 1

请求2.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 的结构:

要求 2

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

XSD 文件关系

XSD组件之间的整体关系:

QTAssistant XSD 组件关系图

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

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

于 2012-04-20T23:12:08.707 回答