XSD文件是否可以确保无限次出现的元素属性恰好为真?

时间:2014-05-23 14:59:33

标签: xml xsd

XML I&#m; m结构可以包含任意数量的" user"元素,我想确保一个名为"的属性是默认"在其中一个用户中设置为true。

例如,像这样的东西是有效的:

<users>
    <user isDefault="false"/>
    <user isDefault="true"/>
    <user isDefault="false"/>
</users>

但是,这个:

<users>
    <user isDefault="true"/>
    <user isDefault="true"/>
    <user isDefault="false"/>
</users>

而且:

<users>
    <user isDefault="false"/>
    <user isDefault="false"/>
    <user isDefault="false"/>
</users>

无效。我可以使用XSD实现这一点,还是需要以编程方式验证它?

2 个答案:

答案 0 :(得分:1)

解决此问题的一种简单方法是重新考虑XML并指定首先列出默认用户,并且首先列出的用户是默认用户。然后,对默认用户的更改涉及将该用户移动到列表顶部,而不是更改两个isDefault值,并且无需进一步努力即可确保始终只有一个user元素是第一个。

答案 1 :(得分:0)

如果必须始终存在isDefault属性,则无法单独使用XSD 1.0来实现此目的。

使用XSD 1.1,您可以使用<xs:assert>

<xs:element name="users">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="user" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:assert test="count(user[@isDefault='true']) = 1"/>
    </xs:complexType>
</xs:element>