Любой порядок + ограничения для каждого элемента - PullRequest
2 голосов
/ 21 декабря 2011

Я пытаюсь создать 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 ]

2 голосов
/ 21 декабря 2011

Что если вы попробуете это:

<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, как xsd:sequence, которые позволят, что вы просите.

0 голосов
/ 22 декабря 2011

То, что вы хотите, выглядит как xsd: all;однако, поскольку xsd: all работает только для элементов, для которых maxOccurs равно 1, он не будет работать здесь.Если вы можете комбинировать варианты и последовательности для ограничения вашего контента, один из способов избежать дублирования определения (избегайте двойного определения) - определить Sample1 и Sample 2 в качестве глобальных элементов, а затем указать их в своих композиторах.Если определение глобальных элементов не является опцией, за исключением ваших корневых элементов, то вы можете, по крайней мере, определить типы глобально - таким образом вы максимизируете повторное использование и несколько приблизитесь к своему требованию "без определения дважды" ...

...