2015-09-11 158 views
0

我需要使用XSD驗證傳入的XML到我的系統。下面是一個示例XML和XSD。XSD驗證子元素的唯一性

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<root> 
    <records> 
     <record> 
      <content>record text</content> 
      <childlist> 
       <child> 
        <chilldref>left_child</chilldref> 
        <content>child 1 text</content> 
       </child> 
       <child> 
        <chilldref>middle_child</chilldref> 
        <content>child 2 text</content> 
       </child> 
       <child> 
        <chilldref>right_child</chilldref> 
        <content>child 3 text</content> 
       </child> 
      </childlist> 
     </record> 
    </records> 
</root> 


<?xml version="1.0" encoding="Windows-1252"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="records"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="record"> 
           <xs:complexType> 
            <xs:all minOccurs="0"> 
             <xs:element name="content" type="xs:string" /> 
             <xs:element name="childlist" minOccurs="1" maxOccurs="1"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element maxOccurs="3" name="child" minOccurs="1"> 
                 <xs:complexType> 
                  <xs:all minOccurs="0"> 
                   <xs:element name="chilldref" type="childreftype" minOccurs="1" /> 
                   <xs:element name="content" type="xs:string" /> 
                  </xs:all> 
                 </xs:complexType> 
                </xs:element> 
               </xs:sequence> 
              </xs:complexType> 
              <xs:unique name="uniqueref"> 
               <xs:selector xpath="child" /> 
               <xs:field xpath="childref" /> 
              </xs:unique> 
             </xs:element> 
            </xs:all> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="childreftype"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="left_child" /> 
      <xs:enumeration value="right_child" /> 
      <xs:enumeration value="middle_child" /> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

這裏我檢查是否有一個'childlist'元素至少有一個'child'元素。對於'child'元素'childref'屬性是強制性的,它應該是'childreftype'類型。 現在我需要確保沒有兩個「child」元素具有相同的「childref」。任何關於如何用XSD實現這一點的想法。

**更新: 將<xs:unique>元素置於'childlist'範圍之後,此工作正常。

回答

2

對於約束「在一個X,必須是具有Z的相同值沒有兩個Y元素」,你需要一個xs:在元素聲明唯一約束爲X:

<xs:unique name="x-y-z"> 
    <xs:selector xpath="Y"/> 
    <xs:field xpath="Z"/> 
</xs:unique> 

在你情況Y =「孩子」和Z =「chilldref」(原文如此),但X可以是根,記錄,記錄或孩子列表 - 你還沒有詳細地指出問題,足以讓我知道。