我有以下 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。(ids 在第一个深度加上父级是唯一的)
- Childgroup 中的子项具有唯一的“id”属性。(因此允许子组中的子项的 id 等于同一父项中子组外的子项的 id,但不允许与自己的子组的 id 相同,如 2. point [(ids are在第一个深度加上父级中是唯一的)])
1. 问题
第 1 点和第 2 点很清楚,但我不知道如何排除子组的后代,我尝试关注但总是出现 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>
第二次尝试
<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>
第三次尝试
<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
- 无效,因为在第二个父母中:孩子 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>
原因
- 无效,因为在第二个父母中: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>
原因
- 无效,因为在第一个父项中:child id="7" 与 child 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>
原因
- 无效,因为在第二个父项中: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>