如何定义只能在一个元素中设置为“true”的布尔属性。 以下片段必须无效。XML模式 - 只有一个元素应该将属性设置为true
<products>
<product featured="yes">Prod 1</product>
<product featured="yes">Prod 2</product>
</products>
如何定义只能在一个元素中设置为“true”的布尔属性。 以下片段必须无效。XML模式 - 只有一个元素应该将属性设置为true
<products>
<product featured="yes">Prod 1</product>
<product featured="yes">Prod 2</product>
</products>
你不能用XML模式来做到这一点。
您可以在元素上定义属性,但不能将它们限制为元素的一个实例。
你不能用XMLSchema做到这一点。如果您想在XML环境中指定这些约束,请尝试Schematron(http://www.schematron.com/)。
我的回复是这样,因为我还不能添加评论。
“您可以在products元素中添加一个属性,以指示哪个产品具有特色。”
此解决方案导致另一个问题:检查属性是否指向现有元素。
<products featured_id="3">
<product id="1">Prod 1</product>
<product id="2">Prod 2</product>
</products>
你可以做以下...
<products>
<product featured="Yes">Prod 1</product>
<product>Prod 2</product>
</products>
然后使用一个独特的元素来约束这样的属性...
<xs:unique name="UniqueFeaturedProduct">
<xs:selector xpath="product"/>
<xs:field xpath="@featured"/>
</xs:unique>
如果要限制“功能'属性为一个值的可选枚举“是”,那么只能有一个特色属性。像这样...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element name="product" type="productType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="UniqueFeaturedProduct">
<xs:selector xpath="product"/>
<xs:field xpath="@featured"/>
</xs:unique>
</xs:element>
<xs:simpleType name="featuredType">
<xs:restriction base="xs:string">
<xs:enumeration value="Yes"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="productType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="featured" type="featuredType" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
我不相信这是可能的XML架构。 – skaffman 2009-12-18 08:19:41