XSD:跨所有节点的唯一ID
XSD: Unique ID across all nodes
我正在努力解决 XSD 应该对我的所有类别应用唯一约束的问题。
我的每个类别都可以有子类别,而子类别又是类别。这就是我的 XSD 的 "Category" 部分的样子;
<xsd:element name="Categories">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Category" maxOccurs="unbounded" type="Category"/>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="CategoryUnique">
<xsd:selector xpath="Category"/>
<xsd:field xpath="ID"/>
</xsd:unique>
</xsd:element>
并且 "Category" 类型:
<xsd:complexType name="Category">
<xsd:all>
<xsd:element name="ID" type="xsd:unsignedInt"/>
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Children" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Category" type="Category" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="CategoryChildUnique">
<xsd:selector xpath="Category"/>
<xsd:field xpath="ID"/>
</xsd:unique>
</xsd:element>
</xsd:all>
</xsd:complexType>
这个 XSD 正确处理了以下事情:
- 防止 "Categories" 级别上的多个 "Category" 节点具有相同的 ID,
- 防止同一父节点中的子节点具有相同的ID
如何确保 ANY "Category" 节点不能与同一父容器中的任何其他 "Category" 节点具有相同的 ID( "Categories" 节点包含在包装器中)
我已经解决了这个问题!
在尝试了很多我能想到的添加之后,我想出了如何让 XSD 检查所有子节点!
<xsd:unique name="CategoriesUnique">
<xsd:selector xpath=".//Category"/>
<xsd:field xpath="ID"/>
</xsd:unique>
这将替换“类别”节点中的唯一约束,并检查所有后续类别节点!
检查 W3Schools 以获取有关 Xpath 语法的信息:
// Selects nodes in the document from the current node that match the selection no matter where they are.
. Selects the current node
我正在努力解决 XSD 应该对我的所有类别应用唯一约束的问题。
我的每个类别都可以有子类别,而子类别又是类别。这就是我的 XSD 的 "Category" 部分的样子;
<xsd:element name="Categories">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Category" maxOccurs="unbounded" type="Category"/>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="CategoryUnique">
<xsd:selector xpath="Category"/>
<xsd:field xpath="ID"/>
</xsd:unique>
</xsd:element>
并且 "Category" 类型:
<xsd:complexType name="Category">
<xsd:all>
<xsd:element name="ID" type="xsd:unsignedInt"/>
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Children" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Category" type="Category" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="CategoryChildUnique">
<xsd:selector xpath="Category"/>
<xsd:field xpath="ID"/>
</xsd:unique>
</xsd:element>
</xsd:all>
</xsd:complexType>
这个 XSD 正确处理了以下事情:
- 防止 "Categories" 级别上的多个 "Category" 节点具有相同的 ID,
- 防止同一父节点中的子节点具有相同的ID
如何确保 ANY "Category" 节点不能与同一父容器中的任何其他 "Category" 节点具有相同的 ID( "Categories" 节点包含在包装器中)
我已经解决了这个问题!
在尝试了很多我能想到的添加之后,我想出了如何让 XSD 检查所有子节点!
<xsd:unique name="CategoriesUnique">
<xsd:selector xpath=".//Category"/>
<xsd:field xpath="ID"/>
</xsd:unique>
这将替换“类别”节点中的唯一约束,并检查所有后续类别节点!
检查 W3Schools 以获取有关 Xpath 语法的信息:
// Selects nodes in the document from the current node that match the selection no matter where they are.
. Selects the current node