2011-11-18 95 views
0

我试图制定一些XML看起来大致是这样的XSD:XSD - 定义多个必需的元素用不同的ID属性,其中之一有子元素

<root> 
    <thing id="1"/> 
    <thing id="2"/> 
    <thing id="3"> 
    <subelement> 
     ... 
    </subelement> 
    </thing> 
</root> 

如果要求每个ID的事一次,而ID为“3”的东西需要特定的子元素。

我能够通过创建一个抽象复杂类型和关闭该扩展(尽管它仍然是未经测试)创建的每个ID的一两件事要求,

<xs:element name="thing" type="tns:abstractType" minOccurs="3" maxOccurs="3"> 
    <xs:unique name="EachIdRequired"> 
    <xs:selector xpath="thing" /> 
    <xs:field xpath="@id"/> 
    </xs:unique> 
</xs:element> 

<xs:complexType name="abstractType" abstract="true/> 
<xs:complexType name="idOne"> 
    <xs:complexContent> 
    <xs:extension base="tns:abstractType"> 
     <xs:attribute name="id" fixed="1" type="xs:integer" use="required"/> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 
<xs:complexType name="idTwo"> 
    <xs:complexContent> 
    <xs:extension base="tns:abstractType"> 
     <xs:attribute name="id" fixed="2" type="xs:integer" use="required"/> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 
<xs:complexType name="idThree"> 
    <xs:complexContent> 
    <xs:extension base="tns:abstractType"> 
     <xs:attribute name="id" fixed="3" type="xs:integer" use="required"/> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

但是,我不知道该如何还具有id 3的complexType的要求也具有所需的子元素。我看到用属性和子元素定义的元素的唯一方法是使用扩展名,但idThree已经扩展了抽象类型。

我是否可能以其他方式去做?我很怀疑,但我想确定。 XSD似乎有些限制。

回答

1

在XML模式中不可能。这种结构的最佳Schema语言是Relax NG。见http://relaxng.org/

相关问题