XSD:所有节点的唯一ID

时间:2018-02-05 13:04:08

标签: xml xsd xsd-validation

我正在努力应对XSD应该对我的所有类别应用唯一约束。

我的每个类别都可以有孩子,而孩子又是孩子。这就是"类别"我的XSD的一部分看起来像;

<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>

&#34;类别&#34;类型:

<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. 防止多个&#34;类别&#34; &#34;类别&#34;上的节点具有相同ID的等级
  2. 防止同一父节点中的儿童拥有相同的ID
  3. 如何确保 ANY &#34;类别&#34;节点不能与任何其他节点具有相同的ID#34;类别&#34;同一父容器中的节点(&#34; Categories&#34;节点包含在包装器中)

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题!

经过多次尝试我想到的所有新增内容后,我已经想出如何让XSD检查所有子节点!

<xsd:unique name="CategoriesUnique">
    <xsd:selector xpath=".//Category"/>
    <xsd:field xpath="ID"/>
</xsd:unique>

这取代了&#34;类别&#34;中的唯一约束。检查节点和所有后续类别节点!

检查W3Schools以获取有关Xpath语法的信息:

  

//从当前节点中选择与选择匹配的文档中的节点,无论它们在何处。

     

。选择当前节点