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(Sample1 只能选择一次):

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

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

感谢帮助

4

2 回答 2

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>

PS: :

不幸的是,没有 XSD 元素,例如xsd:sequence,这将允许您提出任何要求。

于 2011-12-21T13:00:51.793 回答
0

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

于 2011-12-21T20:12:10.667 回答