我需要定义一组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/>
部分,我可以使用一个基本元素,但我的理解是,当我向基础添加任何东西时,它只会在最后添加。我可以在中间替换任何方式,或者在使用基础时添加到中间?
答案 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>
结构如下:
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的结构:
我将select1 / 2和choice3 / 4放在req1和req2中只是为了在内容之间没有重叠。所以文件结构看起来像这样:
XSD组件之间的整体关系:
如果你想从req1和req2引用相同的choice2,你必须在自己的文件中重构choice2等。
关于选择与替代组的讨论很多,但这是另一回事......