每个元素的任何顺序+约束

时间:2011-12-21 12:35:11

标签: xsd xsd-validation

我正在尝试创建一个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(Sample1只能选择一次):

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

但我不知道,我如何混合顺序,而所有元素都有自己的约束。

感谢您的帮助

2 个答案:

答案 0 :(得分: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>

<强> P.S:

遗憾的是,没有像xsd:sequence这样的XSD元素会允许你提出的问题。

答案 1 :(得分:0)

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