XSD 验证 parent 中 n-th child 的唯一 ID 属性

XSD to validate unique id attribute within a parent for n-th child

我似乎遇到了一个不寻常的问题。我有一个 xml 看起来很像他的:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="tbd">
    <A>
        <B id="01">
            <C id="02" />
            <C id="03" />
        </B>
        <B id="04">
            <C id="05" />
        </B>
    </A>
    <A>
        <B id="01">
            <C id="02" />
            <C id="03" />
        </B>
        <B id="04">
            <C id="05" />
        </B>
    </A>
</root>

如你所见,A块可以重复n次。我的问题是验证 id 属性对于 A 的所有后代都是唯一的(child、grandchild、asf.)。到目前为止,我设法验证了 B 的 ID 在 A 内部是唯一的,并且 C 的 ID 在 B 内部是唯一的,XSD 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tbd" xmlns:tbd="tbd" elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="A" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="B" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="C" maxOccurs="unbounded">
                                            <xs:ComplexType>
                                                <xs:attribute name="id" type="xs:int" use="required" />
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                                <xs:attribute name="id" type="xs:int" use="required" />

                                <xs:unique name="UniqueC">
                                    <xs:selector xpath="tbd:C" />
                                    <xs:field xpath="@id" />
                                </xs:unique>

                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>

                    <xs:unique name="UniqueB">
                        <xs:selector xpath="tbd:B" />
                        <xs:field xpath="@id" />
                    </xs:unique>

                </xs:element>
            </xs:sequence>
        </xs:compleyType>
    </xs:element>
</xs:schema>

我正在寻找的是类似 type="xs:ID" 的验证,但不是针对整个文档,而是仅在 A 内部,因此下面的示例将无效(现在这将是有效的):

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="tbd">
    <A>
        <B id="01">
            <C id="01" /> <!-- should be invalid -->
            <C id="02" />
            <C id="04" />
        </B>
        <B id="04"> <!-- should be invalid -->
            <C id="02" /> <!-- should be invalid -->
            <C id="05" />
        </B>
    </A>
    <A>
        <B id="01">
            <C id="012" />
            <C id="02" />
            <C id="04" />
        </B>
        <B id="042">
            <C id="05" />
        </B>
    </A>
</root>

xs:selector 用于 select 字段值应该唯一的节点列表。因此,如果您希望 id 在每个 B 和每个 C 中都是唯一的,那么您需要 select selector 中的所有节点。示例(请注意,在 XPath 中,| 字符表示节点并集):

<xs:selector xpath="tbd:B | tbd:B/tbd:C" />