XSD具有相同内部结构的两个元素

问题描述:

我正在使用xsd,试图让它验证xml。XSD具有相同内部结构的两个元素

xml用于创建对象。有两种类型的对象可以由列表中的元素创建:SC和SMSC。 SMSC是一个SC,并对其进行扩展。

SMSC不包含任何新属性。从xml的角度来看,除了定义其属性的元素被<SMSC>标签包装而不是<SC>标签外,SMSC在各方面都与SC完全相同。

我们的XSD看起来是这样的:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name='Definitions'> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" name="SC"> 
      <!--SNIP properties of SC and SMSC --> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

有没有办法来改变这种允许SC或SMSC作为元素,不是复制所有的属性定义的一个元素SMSC其他?我们不希望将文档的长度加倍并复制所有的属性定义。

就目前来看,我们在XML中唯一的验证错误就是我们有一个SMSC元素。如果没有办法解决这个问题而不重复所有的属性定义,我们会保持原样,但是如果可行的话,我们显然宁愿消除抛出的警告。

虽然它令人困惑by tags instead of tags,我会认为下面要么回答你的问题,要么引出更好的解释。

所以,你看到的是避免重复;您实际上不需要附加类型SMSC(请参阅定义2),但我已将它放在案例中(定义)。使SMSC元素的SC类型将工作完全相同。

定义/Definitions2Definitions3是一个使用的取代基,而不是选择之间的差。我个人更喜欢替代团体进行选择,但遇到与替代团体有关的问题并不罕见(即他们在这里和那里都得不到很好的支持)。

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="SC"> 
     <xsd:sequence> 
      <!-- Stuff goes here --> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="SMSC"> 
     <xsd:complexContent> 
      <xsd:extension base="SC"/> 
     </xsd:complexContent> 
    </xsd:complexType> 
    <xsd:element name="Definitions"> 
     <xsd:complexType> 
      <xsd:choice maxOccurs="unbounded"> 
       <xsd:element name="SC" type="SC"/> 
       <xsd:element name="SMSC" type="SMSC"/> 
      </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 
    <!-- Another way --> 
    <xsd:element name="Definitions2"> 
     <xsd:complexType> 
      <xsd:choice maxOccurs="unbounded"> 
       <xsd:element name="SC" type="SC"/> 
       <xsd:element name="SMSC" type="SC"/> 
      </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="Definitions3"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element ref="SC" maxOccurs="unbounded"/>    
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="SC" type="SC" />     
    <xsd:element name="SMSC" type="SMSC" substitutionGroup="SC" />    
</xsd:schema> 
+0

This Works,thanks!我没有意识到你可以定义新的复杂类型,并在定义中使用它们。你每天学习新的东西! (顺便说一下,第一个版本现在为我们工作) – Jeff 2013-03-12 15:31:41