不同元素的独占属性值集

时间:2013-05-25 18:35:36

标签: xml xsd

这是一个XML模式,用于定义包含paramsatomicParam元素的complexParam根元素的文档。这两种类型的元素都有name属性。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://companyname.org/"
                xmlns:tns="http://companyname.org/"
>

        <element name="params" type="tns:ParamsType"/>

        <complexType name="ParamsType">
                <sequence>
                        <element name="atomicParam" type="tns:AtomicParamType" minOccurs="0" maxOccurs="unbounded"/>
                        <element name="complexParam" type="tns:ComplexParamType" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
        </complexType>

        <complexType name="ComplexParamType">
                <simpleContent>
                        <extension base="string">
                                <attribute name="name" type="string" use="required"/>
                        </extension>
                </simpleContent>
        </complexType>

        <complexType name="AtomicParamType">
                <simpleContent>
                        <extension base="string">
                                <attribute name="name" type="string" use="required"/>
                        </extension>
                </simpleContent>
        </complexType>

</schema>

我的目标是将以下约束应用于name属性:

  1. 如果任何atomicParam具有该属性的某个值(例如foo),则complexParam元素中的任何一个都不应具有此属性的相同值。同时,atomicParam属性中的另一个foo可能有name
  2. 如果任何complexParam具有该属性的某个值(例如bar),则atomicParam元素中的任何一个都不应具有此属性的相同值。同时,complexParam属性中的另一个bar可能有name
  3. 这可能吗?

1 个答案:

答案 0 :(得分:0)

使用XSD 1.0是不可能的:有一种方法可以强制执行值的唯一性,但不能按照此处所需的方式强制执行不同的元素。

应该可以在XSD 1.1中使用断言:

<xsd:assert test="not(atomicParam/@name=complexParam/@name)"/>