2016-02-19 33 views
2

我看起來有一個相當不尋常的問題。我有一個xml,大致看起來像他的:XSD驗證第n個孩子的父代中的唯一ID屬性

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="tbd"> 
    <A> 
     <B id="01"> 
      <C id="02" /> 
      <C id="03" /> 
     </B> 
     <B id="04"> 
      <C id="05" /> 
     </B> 
    </A> 
    <A> 
     <B id="01"> 
      <C id="02" /> 
      <C id="03" /> 
     </B> 
     <B id="04"> 
      <C id="05" /> 
     </B> 
    </A> 
</root> 

正如你所看到的,塊A可以重複n次。我的問題是驗證id屬性對A(child,grandchild,asf。)的所有後代是唯一的。到目前爲止,我設法驗證B的ID是裏面唯一的,而C的編號爲B與上午XSD的獨特的內部看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tbd" xmlns:tbd="tbd" elementFormDefault="qualified"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="A" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="B" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="C" maxOccurs="unbounded"> 
              <xs:ComplexType> 
               <xs:attribute name="id" type="xs:int" use="required" /> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
           <xs:attribute name="id" type="xs:int" use="required" /> 

           <xs:unique name="UniqueC"> 
            <xs:selector xpath="tbd:C" /> 
            <xs:field xpath="@id" /> 
           </xs:unique> 

          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 

        <xs:unique name="UniqueB"> 
         <xs:selector xpath="tbd:B" /> 
         <xs:field xpath="@id" /> 
        </xs:unique> 

       </xs:element> 
      </xs:sequence> 
     </xs:compleyType> 
    </xs:element> 
</xs:schema> 

我在找什麼像類型的確認=「XS:ID」,而不是整個文檔,但只有內部的A,使得下面的例子將是無效的(現在這將是有效的):

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="tbd"> 
    <A> 
     <B id="01"> 
      <C id="01" /> <!-- should be invalid --> 
      <C id="02" /> 
      <C id="04" /> 
     </B> 
     <B id="04"> <!-- should be invalid --> 
      <C id="02" /> <!-- should be invalid --> 
      <C id="05" /> 
     </B> 
    </A> 
    <A> 
     <B id="01"> 
      <C id="012" /> 
      <C id="02" /> 
      <C id="04" /> 
     </B> 
     <B id="042"> 
      <C id="05" /> 
     </B> 
    </A> 
</root> 

回答

1

xs:selector用於選擇字段值應該唯一的節點列表。因此,如果您希望ID在每個B和每個C都是唯一的,那麼您需要選擇選擇器中的所有節點。示例(請注意,在XPath中,|字符表示節點的聯合):

<xs:selector xpath="tbd:B | tbd:B/tbd:C" /> 
+0

非常感謝! 我在現場節點中做了這件事,並沒有奏效。這正是我所期待的:D – PowderFan

+0

不客氣:) – sergioFC

+1

它甚至可以與 一起使用,我也只在字段節點中使用它。 .. 但現在我實際上得到了選擇器和字段節點* facepalm * ^^之間的關係 – PowderFan