Xml 嵌套元素上的XSD唯一约束

Xml 嵌套元素上的XSD唯一约束,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我有以下XML文件: <?xml version="1.0" encoding="UTF-8" ?> <catalog> <chainList> <chain chainName="Chain"> <handlerList> <handler handlerName="This is a name">com.lorescianatico.chain.handler.DummyH

我有以下XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<catalog>
<chainList>
    <chain chainName="Chain">
        <handlerList>
            <handler handlerName="This is a name">com.lorescianatico.chain.handler.DummyHandler</handler>
            <handler handlerName="This is another name">com.lorescianatico.chain.handler.AnotherDummyHandler</handler>
        </handlerList>
    </chain>
    <chain chainName="AnotherChain">
        <handlerList>
            <handler handlerName="This is a name">com.lorescianatico.chain.handler.DummyHandler</handler>
            <handler handlerName="This is another name">com.lorescianatico.chain.handler.AnotherDummyHandler</handler>
        </handlerList>
    </chain>
</chainList>
</catalog>

com.lorescianatico.chain.handler.DummyHandler
com.lorescianatico.chain.handler.AnotherDummyHandler
com.lorescianatico.chain.handler.DummyHandler
com.lorescianatico.chain.handler.AnotherDummyHandler
我需要使用XSD模式执行验证。我定义的模式如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="catalog">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="chainList" minOccurs="1" maxOccurs="1">
                <xs:complexType >
                    <xs:sequence>
                        <xs:element name="chain" minOccurs="0" maxOccurs="unbounded" type="chain"/>
                    </xs:sequence>
                </xs:complexType>
                <xs:unique name="uniqueChainName">
                    <xs:selector xpath="."/>
                    <xs:field xpath="chain/@chainName"/>
                </xs:unique>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="catalogName" type="xs:string"/>
    </xs:complexType>
</xs:element>

<xs:complexType name="chain">
    <xs:sequence>
        <xs:element name="handlerList" minOccurs="1" maxOccurs="1">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="handler" minOccurs="1" maxOccurs="unbounded" type="handler"/>
                </xs:sequence>
            </xs:complexType>
            <xs:unique name="uniqueHandlerClass">
                <xs:selector xpath="."/>
                <xs:field xpath="handler"/>
            </xs:unique>
            <xs:unique name="uniqueHandlerName">
                <xs:selector xpath="."/>
                <xs:field xpath="handler/@handlerName"/>
            </xs:unique>
        </xs:element>
    </xs:sequence>
    <xs:attribute name="chainName" use="required" type="xs:string"/>
</xs:complexType>

<xs:complexType name="handler">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="handlerName" type="xs:string" use="required"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
</xs:schema>

现在,如果使用我粘贴的模式测试此xml,验证将失败,因为我在不同的链中定义了相同的处理程序值。是否有一种定义唯一约束的方法来检查值是否仅在子xml中是唯一的?类似于定义唯一约束的XPath查询的作用域?我希望属性handlerName和handler的值仅在同一个链中是唯一的


提前谢谢。

有时候你只需要停下来想想。几个小时后,我找到了解决方案:

<xs:unique name="uniqueHandlerName">
     <xs:selector xpath="handler"/>
     <xs:field xpath="@handlerName"/>
</xs:unique>

以这种方式写作对我来说很有效