2012-04-20 145 views
2

我需要定义一组XSD。每个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> 

其中选择1,选择2,choice3处于<choice>集,像

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

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

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

回答

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

我把re1和req2中的choice1/2和choice3/4放在内容之间没有重叠。因此,文件结构看起来是这样的:

XSD File relationships

XSD组件之间的整体关系:

QTAssistant XSD component relationships diagram

如果你想有来自REQ1和REQ2引用的同一选择2,你将不得不在其自己的文件中重构choice2等

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

+0

完美工作。 10Q – 2012-04-23 12:26:24