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 正确处理了以下事情:

  1. 防止 "Categories" 级别上的多个 "Category" 节点具有相同的 ID,
  2. 防止同一父节点中的子节点具有相同的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