0

次のインスタンス ドキュメントを想定します。

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

XML スキーマを使用して、シーケンス内で 1 つの<address>要素のみがそのcurrent属性を「true」に設定できるようにすることはできますか。

乾杯

注: この問題の言い方がよくわからないので、より良いアイデアを持っている人がタイトルを修正したり、関連するタグを配置したりできることを願っています。

4

2 に答える 2

1

RichardTowersが示すように、XSD 1.0を使用すると、「現在の」属性を持つ要素が1つだけであることを強制できると思いますが、1つだけが真である複数の「現在の」属性を許可することはできません。

もちろん、アサーションを使用して XSD 1.1 でこれを行うことができます。

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

(またはcount(...) le 1それが意図されたものである場合)。

于 2012-05-21T08:51:25.497 に答える
0

を使用して少なくとも部分的に可能<xsd:unique/>:

<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"されるため、少し調整することをお勧めします。

于 2012-05-21T08:21:24.210 に答える