1. ホーム
  2. xml

[解決済み] XSD - 要素を何度でも好きな順番で並べられるようにするには?

2022-05-15 06:04:38

質問

XSDを作成しようとしているのですが、以下のような要件で定義を書こうとしています。

  • 指定された子要素が何回でも出現できるようにする(0~無制限)
  • 子要素を任意の順番で並べることができるようにする

いろいろ調べてみると、以下のような解決策がありました。 この :

<xs:element name="foo">
  <xsl:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="child1" type="xs:int"/>
      <xs:element name="child2" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

しかし、私が理解するところでは、xs:choiceはまだ単一の要素選択しかできません。したがって、このように MaxOccurs を unbounded に設定すると、子要素の "any one" が複数回出現することを意味するだけになるはずです。これは正確ですか?

上記のソリューションが正しくない場合、私の要件で上記で述べたことをどのように達成できますか。

EDIT : 要件が以下のような場合はどうでしょうか?

  • 要素child1 child2 は、任意の回数(0から無制限)出現することができる。 回数(0から無制限)
  • 要素は任意の順序になるように
  • 要素 child3 と child4 は正確に一度だけ表示されること。

例えば このxmlは有効です。

<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

しかし、これはそうではありません(子3がありません)。

<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

どのように解決するのですか?

質問にあるスキーマで child1 または child2 は、どのような順番でも、何度でも現れることができます。ですから、これはあなたが探しているもののように聞こえます。

これらのうち1つだけを回数無制限で表示したい場合は、代わりに unbounded を要素に使用する必要があります。

<xs:element name="foo">
   <xs:complexType>
     <xs:choice maxOccurs="unbounded">
       <xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
       <xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
     </xs:choice>
   </xs:complexType>
</xs:element>