数年前、XML インストーラー ファイル用に XSD を定義しました。目標は、次のような異なる名前のサブノードを持つ要件ノードを定義することでした:
<requirements>
<core version="1.0.0.1749" />
<field version="1.2">chbxgroup</field>
<php version="5.3"/>
</requirements>
この部分の XSD は次のようになります。
<xs:element name="requirements" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="core" type="requirement" minOccurs="0" maxOccurs="1" />
<xs:element name="cms" type="requirement" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="plugin" type="requirement" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="application" type="requirement" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="field" type="requirement" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="php" type="requirement" minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
</xs:complexType>
</xs:element>
そして要件定義:
<xs:complexType name="requirement" mixed="true">
<xs:attribute name="version" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="(\d+\.)?(\d+\.)?(\d+)?(\.)?(\d+)?" />
<xs:whiteSpace value="preserve" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="type" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="function|class" />
<xs:whiteSpace value="preserve" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
必要に応じて、 https ://xml.sigsiu.net/SobiPro/application.xsd で定義全体を確認できます。
ここで重要な情報です。完全に正常に機能し、私たちが望んでいたとおりに正確に動作します
問題は、定義をチェックした非常に好奇心旺盛で親切なユーザーがいて、彼は XML と XSD について学ぼうとしていて、http://www.w3schools.com/Schema/el_choice.asp のドキュメントを教えてくれたということです。「xs:choice」では、定義された子ノードの 1 つだけを実際に使用できることが明確に示されています。
私はこれについてさまざまなドキュメントをチェックしていましたが、実際にはこれらのそれぞれがまったく同じことを述べています。したがって、私たちが定義した方法を理解するために、そして私が学んだように、それは実際には機能しないはずです。しかし、それは
いくつかの例: http://msdn.microsoft.com/en-us/library/ms256109.aspx
選択したグループに含まれる要素の1 つだけが、それを含む要素内に存在することを許可します。
http://www.w3schools.com/schema/schema_complex_indicators.asp
インジケーターは、1 つの子要素または別の子要素のいずれかが発生する可能性があることを指定します。
では、「xs:choice」の本当の定義は何ですか?
定義された要素の 1 つだけを使用することを本当に許可するのか、または次の子ノードの可能な選択を定義された要素に制限するだけなのか?