2012-05-21 21 views
0

假設以下實例文檔:限制在序列中的一個屬性利用使用XML Schema

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

使用XML Schema,是否可以強制執行,只有一個<address>元素可以有它current屬性設置爲「真」內序列。

乾杯

注:我不太清楚如何詞組這個問題,所以我希望有更好的辦法可以解決的標題,或將相關標籤的人。

回答

1

我認爲使用XSD 1.0可以強制執行,只有一個與「當前」的屬性元素,如RichardTowers表演,但你不能讓多個「當前」的屬性,其中只有一個可能是真的。

您可以XSD 1.1使用斷言這樣做當然是:

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

(或count(...) le 1如果這就是之意)。

+0

有趣的,但快速搜索告訴我''尚未成爲標準的一部分。如果這是真的,那麼上面的驗證會是什麼?說實話,我仍然缺乏使用模式來建模信息的經驗。編輯:進一步的搜索答案我的問題:)謝謝。 – bluearth

+0

我的回答居然聲稱,每'current'屬性具有獨特的價值。假設電流是'XS:boolean'這允許至多2個當前屬性:一個'「真」和''一個「假」'。如果您有XSD 1.1,您的答案是更好的解決方案。 – RichardTowers

+0

@RichardTowers我不把你的替代假表,這是對我來說還是簡單,因爲我還沒有舒服的選擇/的XPath/XQuery的。如果我能提出答案,我會爲兩者做(如果不是對於你放在那裏的完整模式來說至少是優雅的話)。 – bluearth

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"屬性,但是unfortuantely也多current="false",所以你可能需要去適應它一下。