XSD用于验证父节点中第n个子节点的唯一id属性

时间:2016-02-19 14:54:01

标签: xml validation xsd

我似乎有一个相当不寻常的问题。我有一个看起来大概与他相似的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(子,孙,asf。)的所有后代都是唯一的。到目前为止,我设法验证B的id在A中是唯一的,并且C的id在B内部是唯一的,其中X X看起来像这样:

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

我正在寻找的是类似=&#34; xs:ID&#34;的验证。但不是整个文件,而是仅在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>

1 个答案:

答案 0 :(得分:1)

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

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