【问题标题】:XML Schema - only one element should have attribute set to trueXML Schema - 只有一个元素的属性应该设置为 true
【发布时间】:2010-12-27 23:20:42
【问题描述】:
我如何定义一个只能在一个元素中设置为“true”的布尔属性。
后面的sn-p一定是无效的。
<products>
<product featured="yes">Prod 1</product>
<product featured="yes">Prod 2</product>
</products>
【问题讨论】:
标签:
xsd
schema
attributes
【解决方案1】:
您可以执行以下操作...
<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>
【解决方案2】:
我的回复是这样的,因为我还不能添加cmets。
“您可以在 products 元素中添加一个属性来指示哪个产品是特色产品。”
这个解决方案导致另一个问题:检查属性是否指向现有元素。
<products featured_id="3">
<product id="1">Prod 1</product>
<product id="2">Prod 2</product>
</products>
【解决方案4】:
您可以在products 元素中添加一个属性,指示哪个product 是特色。
【解决方案5】:
XML Schemas 无法做到这一点。
您可以在元素上定义属性,但不能将它们限制为元素的一个实例。