3

私の質問の基本的な例として、次のxmlとxsdがあります。

XML

  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="2" />
      </childgroup>
      <child id="5" />
    </parent>


    <parent id="2">
      <childgroup id="33">
        <child id="1" />
        <child id="4" />
      </childgroup>
      <child id="1" />
      <child id="5" />
      <childgroup id="4">
        <child id="1" />
        <child id="6" />
      </childgroup>
    </parent>

  </parentgroup>

XSD

<xsd:element name="parentgroup" type="parentgroup">
    <xsd:unique name="UniqueParentId">
      <xsd:selector xpath="child::parent"></xsd:selector>
      <xsd:field xpath="@id"></xsd:field>
    </xsd:unique>
  </xsd:element>

  <xsd:complexType name="parentgroup">
    <xsd:sequence maxOccurs="unbounded">
      <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath=".//*"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

  <xsd:complexType name="parent">
    <xsd:choice maxOccurs="unbounded" minOccurs="1">
      <xsd:element name="child" type="child" maxOccurs="unbounded" minOccurs="1"></xsd:element>
      <xsd:element name="childgroup" type="childgroup" maxOccurs="unbounded" minOccurs="1"></xsd:element>

    </xsd:choice>

    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

  <xsd:complexType name="childgroup">
    <xsd:sequence maxOccurs="unbounded">
      <xsd:element name="child" type="child" maxOccurs="unbounded" minOccurs="1"></xsd:element>

    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

  <xsd:complexType name="child">
    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

仕事

  1. すべての親には、一意の「id」属性があります。同じ「id」属性を持つ子はありません。彼の親のように。
  2. 親の子と子グループには、一意の「id」属性があります。Childgroup 内の Childs を除外します。(ID は最初の深さと親で一意です)
  3. Childgroup 内の子には、一意の「id」属性があります。(したがって、childgroup 内の子の id が同じ親内の childgroup の子の id と等しいことは許可されますが、2 のように自分の childgroup の id と等しいことは許可されません。ポイント [(id は最初の深さと親で一意)] )

1. 質問

ポイント1.と2.は明確ですが、childgroupの子孫を除外する方法がわかりません。次を試しましたが、常にxpath構文エラーが発生します

初挑戦
     <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath=".//*[not(childgroup)]"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>
2 回目の試行
     <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath=".//*[not(child::childgroup)]"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>
3 回目の試行
     <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath="child::*[not(childgroup)]"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>

ご協力いただきありがとうございます!

無効な XML

例1
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="7">
        <child id="5" />
        <child id="6" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="9" />
      </childgroup>
      <child id="12" />
      <child id="13" />
      <childgroup id="14">
        <child id="15" />
        <child id="16" />
      </childgroup>
    </parent>

  </parentgroup>
理由
  1. 最初の親: childgroup id="7" が child id="7" と同じ ID を持っているため、無効です
  2. 2 番目の親の子 id="9" が「父」の子グループ id="9" と同じ ID を持っているため、無効です
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="7" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="8" />
      </childgroup>
      <child id="12" />
      <child id="14" />
      <childgroup id="14">
        <child id="15" />
        <child id="16" />
      </childgroup>
    </parent>

  </parentgroup>
理由
  1. 2 番目の親の childgroup id="14" が child id="14" と同じ ID を持っているため、無効です
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="7" />
      <childgroup id="4">
        <child id="5" />
        <child id="6" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="11" />
      </childgroup>
      <child id="12" />
      <child id="14" />
      <childgroup id="15">
        <child id="16" />
        <child id="11" />
      </childgroup>
    </parent>

  </parentgroup>
理由
  1. 最初の親の子 id="7" が子 id="7" と同じ ID を持っているため、無効です
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="1" />
        <child id="2" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="11" />
      </childgroup>
      <child id="12" />
      <child id="14" />
      <childgroup id="9">
        <child id="16" />
        <child id="11" />
      </childgroup>
    </parent>

  </parentgroup>
理由
  1. 2 番目の親の childgroup id="9" が childgroup id="9" と同じ ID を持っているため、無効です

有効な XML

例1
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="6" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=1">
        <child id="2" />
        <child id="3" />
      </childgroup>
      <child id="4" />
      <child id="5" />
      <childgroup id="6">
        <child id="7" />
        <child id="9" />
      </childgroup>
    </parent>

  </parentgroup>
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="7" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=1">
        <child id="2" />
        <child id="5" />
      </childgroup>
      <child id="4" />
      <child id="5" />
      <childgroup id="6">
        <child id="2" />
        <child id="5" />
      </childgroup>
    </parent>

  </parentgroup>
4

1 に答える 1

3

エラーをクリーンアップして修正しました。以下は、投稿されたXMLで動作する新しいXSDと、私が理解した方法での要件です。次の図が、使用する必要のある制約とXPathをより適切に視覚化するのに役立つことを願っています。

XSD制約を示すQTAssistant図

変更されたXSD:

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="parentgroup" type="parentgroup">
        <xsd:unique name="UniqueParentId">
            <xsd:selector xpath="parent"/>
            <xsd:field xpath="@id"/>
        </xsd:unique>
    </xsd:element>

    <xsd:complexType name="parentgroup">
        <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="parent" type="parent" maxOccurs="unbounded">
                <xsd:unique name="UniqueChildId">
                    <xsd:selector xpath=".|childgroup|child"/>
                    <xsd:field xpath="@id"/>
                </xsd:unique>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="parent">
        <xsd:choice maxOccurs="unbounded">
            <xsd:element name="child" type="child" maxOccurs="unbounded"/>
            <xsd:element name="childgroup" type="childgroup" maxOccurs="unbounded">
                <xsd:unique name="UniqueChildIdInChildGroup">
                    <xsd:selector xpath=".|child"/>
                    <xsd:field xpath="@id"/>
                </xsd:unique>
            </xsd:element>
        </xsd:choice>
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="childgroup">
        <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="child" type="child" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="child">
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>
</xsd:schema>

更新:XSDはすべてのサンプルXMLで正常に動作します。QTAssistantがそれぞれについて言っていることは次のとおりです。

無効:例1:

Error occurred while loading [], line 9 position 4 There is a duplicate key sequence '7' for the 'UniqueChildId' key or unique identity constraint. Error occurred while loading [], line 15 position 5 There is a duplicate key sequence '9' for the 'UniqueChildIdInChildGroup' key or unique identity constraint. ParentChildChildGroup-Inv-Eg1.xml is invalid.

例2:

Error occurred while loading [], line 21 position 5 There is a duplicate key sequence '14' for the 'UniqueChildId' key or unique identity constraint. ParentChildChildGroup-Inv-Eg2.xml is invalid.

例2(3?):

Error occurred while loading [], line 9 position 4 There is a duplicate key sequence '7' for the 'UniqueChildId' key or unique identity constraint. ParentChildChildGroup-Inv-Eg3.xml is invalid.

例2(4?):

Error occurred while loading [], line 21 position 5 There is a duplicate key sequence '9' for the 'UniqueChildId' key or unique identity constraint. ParentChildChildGroup-Inv-Eg4.xml is invalid.

有効なXMLとして記述したものは、正常に検証されます。

于 2012-07-27T18:32:53.233 に答える