3

これは、 XMLノードの順序付けられていないリストのスキーマを作成する方法と同様の質問ですが、実際には少し単純です。しかし、私はシーケンスと選択肢の背後にあるロジックを理解するのに非常に苦労しています(そして特にそれらが選択肢のシーケンスまたはシーケンスの選択肢にネストされている場合)、そして私は長い間それを研究しましたが、上記の例がどのように理解できません動作します。

必要なのは、ノードのリストであるChildAとChildBのスキーマです。これにより、ChildAは0〜n回発生する可能性がありますが、ChildBは0〜1回しか発生しません。(実際には、各タイプのノードがいくつか必要ですが、ChildAとChildBに対してそれを実行できる場合は、ChildXなどとChildYなどに拡張するのは簡単です)。順序の制約はありません。助けていただければ幸いです。スキーマインジケーターを詳細に説明するリンクも役立ちます。

4

3 に答える 3

3

これはすぐに頭に浮かんだ最も簡単な解決策でしょう。ここで重要なのは、「メイン」シーケンス内で別のシーケンスを使用することです。スキーマは、最初に内部シーケンスを設定することによって決定論的に維持され、そのシーケンスのカーディナリティを0-1に設定することによってオプションに保たれます<ChildB><ChildB>

これはXMLSchema1.0ソリューションです。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- Schema for elements ChildA and ChildB
      The requirements are as follows:
          * ChildA and ChildB may occur in any order.
          * ChildA is optional and may occur multiple times.
          * ChildB is optional and may occur once only.
  -->

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="AB-container" type="AB-type" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="AB-type">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="ChildA" type="xs:string" />
      <xs:sequence minOccurs="0">
        <xs:element name="ChildB" type="xs:string" />
        <xs:element minOccurs="0" maxOccurs="unbounded" name="ChildA" type="xs:string" />
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
于 2013-02-12T23:44:49.203 に答える
1

簡単に言うと、XSD1.0では実行できません。XSD 1.1では、コンポジターを使用できますxsd:all(maxOccurs =1のみを持つというXSD1.0からの制限が削除されたため)-ただし、XSD 1.1の問題は、i)ベータXercesバージョンとしてのみ自由に利用できることです-これまでのところ私が知っているように、そして現時点では; ii)それをサポートするSAXONエディションがあります。前回それへの参照を見たときは、その費用を支払う必要があります。iii)他の人々のほとんどはまだXSD 1.0を使用しているため、他の人々との相互運用に苦労します。

Schematronを使用できる場合(XSLT 1.0 / 2.0であるため、XSD 1.1よりも確実にアクセスしやすい)、特定の元素粒子の数が指定された基準を満たすようにコーディングするのは簡単です。XSDを拡張し、コンポジターが繰り返しxsd:choiceになり、選択オプションが許可されたセットの要素になります。

一部の人々は、正規表現からの構成と並列化することによってXSDコンポジターを説明しようとします。これに精通している場合xsd:all、XSD 1.0では角かっこに似ています(ただし、範囲や否定の概念はありません)xsd:choice。(パイプ、交互)そしてxsd:sequence残りです(あなたがあなたのものを書く順序が重要であるところ)。

SOの他の人がW3Schoolsを勧めているようです。私はそれを自分で試していなかったので、免責事項とともにこれをあなたに渡します。

于 2013-01-14T20:03:41.780 に答える
0

@DaveはChildBにいくつかのダム属性を追加していますか?childBの要件は0-1であるため、childBに固定属性を追加し、その属性に一意の制約を適用することで、目的のソリューションを実現できます。

<complexType name="childAType">
 <simpleContent>
   <extension base="string"></extension>
 </simpleContent>
</complexType>


<complexType name="childBType">
 <simpleContent>
   <extension base="string">
     <attribute name="value" type="string" fixed="123"></attribute>
   </extension>
 </simpleContent>
</complexType>


<element name="root">
 <complexType>
   <choice minOccurs="0" maxOccurs="unbounded">
        <element name="childA" type="tns:childAType" minOccurs="0" maxOccurs="unbounded"></element>
        <element name="childB" type="tns:childBType" minOccurs="0" maxOccurs="unbounded"></element>
   </choice>
 </complexType>
 <unique name="childB.max.once">
   <selector xpath="./tns:childB"></selector>
   <field xpath="@value"></field>
 </unique>
</element>

以下は有効なXMLの1つです(Bの順序は重要ではないか、Bを除外できます)

<tns:root xmlns:tns=" ">
 <tns:childA></tns:childA>
 <tns:childB></tns:childB>
 <tns:childA></tns:childA>
 <tns:childA></tns:childA>
</tns:root>

ただし、以下のものは無効です

<tns:root xmlns:tns=" ">
 <tns:childB></tns:childB>
 <tns:childA></tns:childA>
 <tns:childB></tns:childB>
 <tns:childA></tns:childA>
 <tns:childA></tns:childA>
</tns:root>
于 2013-01-15T08:57:42.073 に答える