假设以下实例文档:
<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”。
干杯
注意:我不太清楚如何说出这个问题,所以我希望有更好主意的人可以修改标题或放置相关标签。
答案 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"
,因此您可能需要对其进行一些调整。