0

特定のルールを検証するスキーマを持つ方法を見つけようとしていますが、xs:all、xs:choice、xs:group、および xs:sequence のさまざまな組み合わせを試しましたが、成功しませんでした。ルールは基本的に次のとおりです。

  1. LICAPPIN01 要素は 1 回だけ出現する必要があります。
  2. LICAPPIN99 要素は 1 回だけ出現する必要があります。
  3. LICAPPIN30 と LICAPPIN31 の数は同じでなければなりません。
  4. LICAPPIN40 と LICAPPIN41 の数は同じでなければなりません。
  5. LICAPPIN30/31 または LICAPPIN40/41 の少なくとも 1 つのセットが必要です (両方が存在する場合もあります)。
  6. 上記のすべてについて、順序は重要ではありません。どの順序でもかまいません。

私たちが試した最も単純なスキーマは次のとおりです。

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="NewDataSet">
    <xs:complexType>
      <xs:choice  minOccurs="1" maxOccurs="unbounded">
        <xs:element name="LICAPPIN01" minOccurs="1" maxOccurs="1">
        </xs:element>
        <xs:element name="LICAPPIN30" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN31" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN40" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN41" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN99" minOccurs="1" maxOccurs="1">
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

これにはいくつかの問題があります。

  • 複数の LICAPPIN01 と LICAPPIN99 を許可します (xs:all に置き換えると、これが修正される可能性があります?)
  • ルール 3 と 4 は適用されません。
  • ルール 5 では、2 つのセットのうち 1 つしか持てないはずなのに、LICAPPIN30/31 と LICAPPIN40/41 の両方を強制するようです。

また、LICAPPIN30/31 と LICAPPIN40/41 に対して xs:group を使用してより複雑なアプローチを試みましたが、ルール 6 に違反しました。

これが私たちの基本的なルールをすべて満たすことができるかどうか、何か考えはありますか? 比較的単純なスキーマで。上記の例では、各 LICAPPINnn 要素内のすべての詳細を削除しました。それらにはそれぞれ複雑な型が含まれており、理想的にはこれらを複数の場所で複製する必要はありません。

ありがとう、デニス

4

1 に答える 1

0

すべての要件を満たすコンテンツ モデルを作成するのは簡単ではありませんが、最後の要件を除いてすべてを満たすのは簡単です。

要素の順序のバリエーションが必要な情報を伝えるために不可欠である場合、最善の策は XSD 1.1 または Schematron でアサーションを使用することです。要素の順序の変化が情報を伝えない場合、順序の変化が要件ではないことを宣言するオプションがあります。私が最も尊敬する語彙設計の権威は、子のシーケンスが情報を伝達しない場合、それを修正しない理由はないとかなり一貫して言っています。

以下は、最後の要件を除くすべての要件を満たすコンテンツ モデルです。

<xs:complexType>
  <xs:sequence>
    <xs:element name="LICAPPIN01"/>
    <xs:choice maxOccurs="unbounded">
      <xs:sequence>
        <xs:element name="LICAPPIN30"/>
        <xs:element name="LICAPPIN31"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="LICAPPIN40"/>
        <xs:element name="LICAPPIN41"/>
      </xs:sequence>
    </xs:choice>        
    <xs:element name="LICAPPIN99"/>
  </xs:sequence>
</xs:complexType>
于 2013-02-21T00:37:07.483 に答える