【问题标题】: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>

【问题讨论】:

  • 我不相信 XML Schema 可以做到这一点。

标签: 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>
    

    【讨论】:

    【解决方案3】:

    你不能用 XMLSchema 做到这一点。如果您想在 XML 环境中指定这些约束,请尝试使用 Schematron (http://www.schematron.com/)。

    【讨论】:

      【解决方案4】:

      您可以在products 元素中添加一个属性,指示哪个product 是特色。

      【讨论】:

      • @AOI Karasu:我认为检查绝对不可能
      【解决方案5】:

      XML Schemas 无法做到这一点。

      您可以在元素上定义属性,但不能将它们限制为元素的一个实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多