使用XML Schema按顺序限制单个属性的使用

时间:2012-05-21 07:49:35

标签: xml xsd

假设以下实例文档:

<person>
  <name>Maurice Moss</name>
  <addresses>
    <address current="true">441 Wallaby way</address>
    <address>2 Mercer Road</address>
  </addresses>
</person>

使用XML Schema,是否可以强制只有一个<address>元素可以将序列中的current属性设置为“true”。

干杯

注意:我不太清楚如何说出这个问题,所以我希望有更好主意的人可以修改标题或放置相关标签。

2 个答案:

答案 0 :(得分:1)

我认为使用XSD 1.0可以强制执行只有一个带有“当前”属性的元素,正如RichardTowers所示,但是你不能允许多个“当前”属性,其中只有一个属性可以为真。

您当然可以使用断言在XSD 1.1中执行此操作:

<xs:assert test="count(address[@current='true']) eq 1"/>

(或count(...) le 1,如果这是预期的。)

答案 1 :(得分:0)

至少部分可以使用<xsd:unique/>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="person">
        <xs:complexType>
            <xs:all>
                <xs:element name="name"/>
                <xs:element name="addresses">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="address" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="current" type="xs:boolean"/>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                    <!-- HERE -->
                    <xs:unique name="onlyOneCurrentAddress">
                        <xs:selector xpath="address"/>
                        <xs:field xpath="@current"/>
                    </xs:unique>
                    <!-- /HERE -->
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

这会阻止多个current="true"属性,但不幸的是还有多个current="false",因此您可能需要对其进行一些调整。