2011-11-15 46 views
8

假設我們有以下模式:限制ID引用一個特定的元素組

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="a_elements"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="a_element" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:attribute name="id" type="xs:ID" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="b_elements"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="b_element" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:attribute name="id" type="xs:ID" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="c_elements"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="c_element" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:attribute name="id" type="xs:ID" use="required"/> 
           <xs:attribute name="ref" type="xs:IDREF" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

和這裏的示例XML文件:

<root> 
    <a_elements> 
     <a_element id="id1"/> 
     <a_element id="id2"/> 
    </a_elements> 
    <b_elements> 
     <b_element id="id3"/> 
     <b_element id="id4"/> 
    </b_elements> 
    <c_elements> 
     <c_element id="id5" ref="id1"/> 
     <c_element id="id6" ref="id2"/> 
    </c_elements> 
</root> 

這樣c_elements可以通過ID引用a_elements和b_elements。是否有可能以某種方式將ref屬性限制爲只接受對來自一個組的元素的引用,比如說a_elements?

回答

6

而且我先前的答案,在理論上講,你不能用單純的ID/IDREF但是它可能添加身份約束其滿足您的要求限制:由下式給出

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 

    <xs:complexType> 

     <xs:sequence> 
     <xs:element name="a_elements"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="a_element" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="b_elements"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="b_element" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="c_elements"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="c_element" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" use="required"/> 
        <xs:attribute name="ref" type="xs:IDREF" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:keyref name="theKeyRef" refer="theKey"> 
     <xs:selector xpath="c_elements/*"/> 
     <xs:field xpath="@ref"/> 
    </xs:keyref> 
    <xs:key name="theKey"> 
     <xs:selector xpath="a_elements/*"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    </xs:element> 
</xs:schema> 
+0

這似乎是我正在尋找。謝謝! – Max

1

我不知道有任何機制使用ID和IDREF來做到這一點。通過設計ID和IDREF參考文檔中的所有標籤。

也就是說,你可以用某種方式解決這個問題 - 也許可以在任何進程數據結構上使用驗證規則。例如,使用Xpath表達式來完成此操作相當容易。您當然可以使用Schematron斷言來實現這一點。這裏有一個例子:​​

希望這會有所幫助。

0

解決方案如果您使用XSD 1.0,kennethmay可能無法正常工作。例如,我正在使用visual studio 2015編輯器,並指出讓我們說b的元素(例如)未被識別爲錯誤。我想這隻適用於XSD版本1.1

相關問題