私の質問の基本的な例として、次の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>
仕事
- すべての親には、一意の「id」属性があります。同じ「id」属性を持つ子はありません。彼の親のように。
- 親の子と子グループには、一意の「id」属性があります。Childgroup 内の Childs を除外します。(ID は最初の深さと親で一意です)
- 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>
理由
- 最初の親: childgroup id="7" が child id="7" と同じ ID を持っているため、無効です
- 2 番目の親の子 id="9" が「父」の子グループ id="9" と同じ ID を持っているため、無効です
<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>
理由
- 2 番目の親の childgroup id="14" が child id="14" と同じ ID を持っているため、無効です
<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>
理由
- 最初の親の子 id="7" が子 id="7" と同じ ID を持っているため、無効です
<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>
理由
- 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>