【问题标题】:Restrict single attribute usage in sequence using XML Schema使用 XML Schema 按顺序限制单个属性的使用
【发布时间】:2012-05-21 18:09:12
【问题描述】:

假设如下实例文档:

<person>
  <name>Maurice Moss</name>
  <addresses>
    <address current="true">441 Wallaby way</address>
    <address>2 Mercer Road</address>
  </addresses>
</person>

使用 XML Schema,是否可以强制在序列中只有一个 &lt;address&gt; 元素可以将其 current 属性设置为“true”。

干杯

注意:我不太清楚如何表达这个问题,所以我希望任何有更好想法的人可以修复标题或放置相关标签。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    我认为使用 XSD 1.0 可以强制只有一个元素具有“当前”属性,如 RichardTowers 所示,但您不能允许多个“当前”属性只有一个可能为真。

    您当然可以在 XSD 1.1 中使用断言来做到这一点:

    <xs:assert test="count(address[@current='true']) eq 1"/>
    

    (或count(...) le 1,如果这是预期的)。

    【讨论】:

    • 有趣,但快速搜索告诉我&lt;assert&gt; 尚未成为标准的一部分。如果这是真的,那么上面的内容是否有效?老实说,我仍然缺乏使用模式对信息建模的经验。编辑:进一步搜索回答我的问题:) 谢谢。
    • 我的回答实际上断言每个current 属性都有一个唯一值。假设 current 是 xs:boolean,这最多允许 2 个当前属性:一个 "true" 和一个 "false"。如果您有 XSD 1.1,您的答案是一个更好的解决方案。
    • @RichardTowers 我不会把你的替代方案放在桌面上,它对我来说仍然更简单,因为我对选择器/xpath/xquery 还不满意。如果我可以为答案投票,我会为两者都做(如果不是为了优雅,至少对于你放在那里的完整模式)。
    【解决方案2】:

    至少部分可能使用&lt;xsd:unique/&gt;

    <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",因此您可能需要稍微调整一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多