Xsd 任何订单+;每个元素的约束

Xsd 任何订单+;每个元素的约束,xsd,xsd-validation,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,它允许子元素以任何顺序排列。但是每个子元素都有自己的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只能选择一次):


但我不知道,当所有元素都有自己的约束条件时,如何混合顺序

感谢您的帮助

如果您尝试以下方法,会怎么样:

<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元素,它将允许您请求的内容。

您想要的内容看起来像XSD:all;但是,由于xsd:all仅适用于maxOccurs为1的元素,因此它在这里不起作用。如果您可以组合选择和序列来约束内容,一种避免重复定义(避免定义两次)的方法是将Sample1和sample2定义为全局元素,然后在合成器下引用它们。如果除了根元素之外,定义全局元素不是一个选项,那么您至少可以全局定义类型-这样您可以最大限度地重用,并且在某种程度上更接近您的需求“无需定义两次”

是的,这就是我的意思。但是,如果不两次定义元素“Sample2”,我如何解决这个问题呢?我已经用一个例子更新了我的答案,说明了如何使用相同的方法,但是指定了您的类型。谢谢您的帮助。也许我必须考虑其他的方法来解决这个问题。你有没有一个例子来说明你的建议?
<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>