0

現時点では、モデルを XSD に適したものにしようとしています。問題は次のとおりです。

List
 I-> Item1
       I->Element1
       I->Element2
       I->Element3       
 I-> Item2
       I->Element1
       I->Element2
       I->Element3
 I-> Item3
       I->Element1
       I->Element2
       I->Element3

ReferenceToElement
 I-> Item1/Element1

2 つの入れ子になったリストが必要なモデルを取得しました。したがって、「アイテム」を含むリストがあり、各アイテムには要素を含むリストがあります。したがって、これらの要素を参照したいと思います。

最初のアプローチ

各項目/要素には数値プロパティがあります。number プロパティは、すべてのアイテム内で一意です。さらに、number プロパティは、親アイテムの番号がその番号でエンコードされるという点で、すべての要素で一意です。たとえば、item.no = 2 の場合、すべての要素はこの 2xx のように見えるため、201、202 などになります。もちろん、これは要素を 100 に制限します。これは問題ありません。

参照された要素の存在を維持するために、すべてのアイテムのすべての要素だけでなく、すべてのアイテムのすべての要素が一意になるように制約を作成しました。したがって、要素への参照は次のようになります

Reference
  - ItemNo
  - ElementNo

このようにして、アイテムと要素が存在することを確認しました。これらの 2 つのフィールドの間に問題があることはわかっています。参照される項目が要素番号で暗黙的に記述されているとは限らないからです。たとえば、ItemNo=1 ですが、ElementNo=202 です。このようにして、スキーマの検証により、少なくともこれらの要素が存在するかどうかがわかります。主な欠点は、すべての要素で番号の正しい割り当てを処理する必要があることです。

2 番目のアプローチ

elementNo には制約を使用せず、itemNo のままにします。そうすれば、すべての要素で単純な数字を使用できますが、スキーマの検証中に elementNo の参照 itegrity が失われます。現時点では、これが最善の方法のようです。

質問:

XSD 機能を使用して 2 段階の参照をモデル化する方法はありますか? アサーションについて何か読んだことがありますが、この状況では役に立たないようです。

4

1 に答える 1

0

[実際に XML を示した方が、質問を理解しやすくなることに注意してください。現状では、散文記述が記述しようとしている XML 構造についての推測に部分的に基づいて回答する必要があります。次に、それらを一粒の塩で取ります。]

私があなたを理解している場合、あなたはいくつかの制約を課したいと考えています(参照用にここに番号が付けられています):

  1. <element>要素は、要素の子として表示され<item>ます。

  2. <element>and<item>要素には、number値が識別番号である属性があります。各number属性の値は、10 進数の有限シーケンスです。

  3. 各要素の識別番号は、識別されたコンテナー要素 (ドキュメント要素など) 内の<item>すべての要素で一意です。<item>

  4. 各要素の識別番号は、同じコンテナー要素内の<element>すべての要素で一意です。<element>(または、それが含まれているアイテム内のすべての<element>要素で一意であることを意味するのでしょうか?あなたの説明からはわかりません。)

  5. <element>要素の識別番号には、親<item>要素の識別番号がプレフィックスとして付きます。

  6. 各要素の識別番号は、親要素<element>の識別番号より正確に 2 桁長くなります。<item>

次のスキーマは、これらの制約を課します。アサーションについて言及されているので、XSD 1.1 で作業できると思います。(1.1 を持っていない場合、アサーションはありません。)

<xs:schema 
    targetNamespace="http://example.com/elements-and-items"
    xmlns:tns="http://example.com/elements-and-items"
    elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="test" type="tns:test">
    <xs:unique name="item-unique">
      <xs:annotation>
        <xs:documentation>
          Ensure that the number attribute on each
          item is unique within the 'test' element.
          (Enforces constraint 3.)
        </xs:documentation>
      </xs:annotation>
      <xs:selector xpath=".//tns:item"/>
      <xs:field xpath="@number"/>
    </xs:unique>
    <xs:unique name="element-unique">
      <xs:annotation>
        <xs:documentation>
          Ensure that the number attribute on each
          item is unique within the 'test' element.
          (Enforces constraint 4.  If 'element' elements
          are only supposed to be unique within 'item'
          elements, then move this to the declaration of
          the 'item' element, and forget constraint
          5.)                    
        </xs:documentation>
      </xs:annotation>
      <xs:selector xpath=".//tns:item/tns:element"/>
      <xs:field xpath="@number"/>
    </xs:unique>

  </xs:element>

  <xs:element name="item" type="tns:item"/>

  <xs:element name="element" type="tns:element"/>

  <xs:complexType name="test">
    <xs:annotation>
      <xs:documentation>
        Each 'test' element contains a sequence of
        'item' elements.
        (Helps enforce constraint 1.)
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element ref="tns:item" maxOccurs="unbounded"/>
    </xs:sequence>        
  </xs:complexType>

  <xs:complexType name="item">
    <xs:annotation>
      <xs:documentation>
        Each 'item' element contains a sequence of
        'element' elements.
        (Helps enforce constraint 1.)
        Each 'item' element has a 'number' attribute,
        of type 'tns:number'.
        (Enforces constraint 2 for 'item' elements.)
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element ref="tns:element" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="number" type="tns:number"/>
    <xs:assert test="
        every $id in ./@number satisfies
        every $e in .//tns:element/@number satisfies
        starts-with($e,$id)">
      <xs:annotation>
        <xs:documentation>
          Each element-identifying number has the
          item-identifying number of the containing item
          as a prefix.
          Enforces constraint 5.
        </xs:documentation>
      </xs:annotation>
    </xs:assert>
    <xs:assert test="
        every $id in ./@number satisfies
        every $e in .//tns:element/@number satisfies
        string-length($e) = string-length($id) + 2">
      <xs:annotation>
        <xs:documentation>
          Each element-identifying number is two
          digits longer than the item-identifying
          number of the containing item.
          Enforces constraint 6.
        </xs:documentation>
      </xs:annotation>
    </xs:assert>
  </xs:complexType>

  <xs:complexType name="element" mixed="true">
    <xs:annotation>
      <xs:documentation>
        Each 'element' element has a 'number' attribute,
        of type 'tns:number'.
        (Enforces constraint 2 for 'element' elements.)
      </xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="number" type="tns:number"/>
  </xs:complexType>

  <xs:simpleType name="number">
    <xs:restriction base="xs:string">
      <xs:pattern value="\d+"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

すべての XSD 1.1 プロセッサは、アサーションで XPath 2.0 の最小限のサブセットをサポートする必要があることに注意してください。私は、そのサブセット内でアサーションをここに書こうとはしませんでした (ただし、そのサブセットにアサーションを記述できるかできないかを判断する努力もしていません)。

非XMLの例と構造的に同一の有効なインスタンス(私が知る限り):

<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
    http://example.com/elements-and-items 
    uniqueness.xsd"
 xmlns="http://example.com/elements-and-items">

  <item number="1">
    <element number="101"/>
    <element number="102"/>
    <element number="103"/>
  </item>
  <item number="2">
    <element number="201"/>
    <element number="205"/>
    <element number="206"/>
  </item>
  <item number="3">
    <element number="303"/>
    <element number="301"/>
    <element number="302"/>
  </item>

</test>

違反することによって各制約を示す無効なインスタンス。スキーマが機能している場合、各違反が検出され、適切な要素またはアイテムが無効になります。

<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
    http://example.com/elements-and-items
    uniqueness.xsd"
 xmlns="http://example.com/elements-and-items">

  <item number="1">
    <element number="101"/>
    <element number="102"/>
    <element number="103"/>
  </item>
  <item number="1">
    <!--* duplicate item number, invalid
        * (violates constraint 3) 
        *-->
    <element number="104"/>
    <element number="105"/>
    <element number="106"/>
  </item>
  <item number="2">
    <element number="107">
      element number unique but doesn't match item number 
      (violates constraint 5)
    </element>
    <element number="202"/>
    <element number="202">
      item number not unique
      (violates constraint 4)
    </element>
  </item>
  <item number="3">
    <element number="303"/>
    <element number="301"/>
    <element number="3141592">
      item number unique and matches item number
      but more than two digits longer 
      (violates constraint 6)</element>
  </item>

</test>
于 2013-02-27T16:04:04.337 に答える