2011-12-21 53 views
2

我想创建一个XSD,它允许子元素以任何顺序。但是每个子元素都有自己的minOccurs和maxOccurs。每个元素的任何顺序+约束

我的XSD:

<xsd:complexType name="Samples"> 
<xsd:sequence > 
    <xsd:element name="Sample1" minOccurs="1" maxOccurs="1"> 
    <xsd:complexType> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:boolean" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"> 
    <xsd:complexType> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:sequence> 

例如有效的XML:

<Samples> 
<Sample2></Sample2> 
<Sample1></Sample1> 
<Sample2></Sample2> 
</Samples> 

例如不是有效的XML(样本1可以只选择一个时间):

<Samples> 
<Sample2></Sample2> 
<Sample1></Sample1> 
<Sample2></Sample2> 
<Sample1></Sample1> 
</Samples> 

但是我不知道,我怎么能混合顺序,而所有的元素都有自己的约束。

感谢您的帮助

回答

2

如果你试试这个:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Samples"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="Sample1" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

当然,你需要加入限制每个元素:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="Sample1Type"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:boolean" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    <xsd:complexType name="Sample2Type"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string" /> 
     </xsd:simpleContent> 
    </xsd:complexType> 
    <xsd:element name="Samples"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element type="Sample1Type" name="Sample1" minOccurs="1" maxOccurs="1"/> 
     <xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

,甚至简单的类型更短:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Samples"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element type="xsd:boolean" name="Sample1" minOccurs="1" maxOccurs="1"/> 
     <xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

产品号:

不幸的是没有像xsd:sequence这样的XSD元素,它允许你询问什么。

+0

是这就是我的意思。但是我怎么能解决这个问题,而没有定义元素“Sample2”两次? – Roxane 2011-12-21 13:59:36

+0

我已经更新了我的答案,举例说明了如何使用相同的方法,但是指定了您的类型 – 2011-12-21 20:10:58

+0

好的,谢谢您的帮助。也许我必须考虑其他解决问题的方法。 – Roxane 2011-12-22 07:54:56

0

你想要什么看起来像xsd:all;然而,因为xsd:all只适用于maxOccurs为1的元素,所以它不会在这里工作。如果你可以结合选择和序列来约束你的内容,那么避免重复定义(避免定义两次)的一种方法是将Sample1和Sample2定义为全局元素,然后在你的合成器下引用它们。如果定义全局元素不是除了根元素之外的选项,那么您至少可以定义全局类型 - 这样您可以最​​大限度地重用,并且有点更接近您的要求“没有定义两次”...

+0

你有什么建议吗? – Roxane 2011-12-22 07:58:33

+0

我会通过EOD发布更新。 – 2011-12-22 15:58:20