2013-03-27 89 views
2

我有一個要求強制元素屬性的唯一性,但僅限於父元素的範圍內。下面是有效的XML的一個例子以上在定義的範圍內強制XML屬性唯一性

<ns:Root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:Test.Namespace" 
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd" 
    > 
    <ns:element1 id="001"> 
     <ns:element2 id="001.1" order="1"> 
      <ns:element3 id="001.1.1" /> 
     </ns:element2> 
     <ns:element2 id="001.2" order="2"> 
      <ns:element3 id="001.1.2" /> 
     </ns:element2>   
    </ns:element1> 
    <ns:element1 id="002"> 
     <ns:element2 id="002.1" order="1"> 
      <ns:element3 id="002.1.1" /> 
     </ns:element2> 
     <ns:element2 id="002.2" order="2"> 
      <ns:element3 id="002.1.2" /> 
     </ns:element2>   
    </ns:element1>  
</ns:Root> 

注意,有兩套「部件1」和之內的element2的節點有一個名爲「訂單」的屬性。要求是'order'在父元素'element1'中必須是唯一的。例如,該簡化的版本將是無效的XML

<ns:Root 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns="urn:Test.Namespace" 
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd" 
    > 
    <ns:element1 id="001"> 
     <ns:element2 id="001.1" order="1"> 
      <ns:element3 id="001.1.1" /> 
     </ns:element2> 
     <ns:element2 id="001.2" order="1"> 
      <ns:element3 id="001.1.2" /> 
     </ns:element2>   
    </ns:element1>  
</ns:Root> 

我寫了下面的架構爲我做到這一點;

<?xml version="1.0"?> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="urn:Test.Namespace" 
      xmlns:ns="urn:Test.Namespace" 
      elementFormDefault="qualified"> 
    <xsd:element name="Root"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     <xsd:unique name="uniqueElement2OrderInElement1"> 
      <xsd:selector xpath="./ns:element1" /> 
      <xsd:field xpath="ns:element2/@order" /> 
     </xsd:unique>   
    </xsd:element> 

    <xsd:complexType name="element1Type"> 
     <xsd:sequence> 
      <xsd:element name="element2" maxOccurs="unbounded" type="ns:element2Type"/> 
     </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="element2Type"> 
     <xsd:sequence> 
      <xsd:element name="element3" type="ns:element3Type" /> 
     </xsd:sequence> 
     <xsd:attribute name="id" type="xsd:string" /> 
     <xsd:attribute name="order" type="xsd:string" /> 
    </xsd:complexType> 

    <xsd:complexType name="element3Type"> 
     <xsd:attribute name="id" type="xsd:string"/> 
    </xsd:complexType>   
</xsd:schema> 

這很接近,因爲它確實實施了唯一性,但文件範圍很廣。即每個訂單屬性必須是唯一的。我認爲這是因爲它放在Root的模式中,但我試圖將它移到更加本地化的位置,或者使選擇器更具體,並且它不起作用(我得到錯誤)。

正在嘗試做什麼?

在期待非常感謝

回答

2

你在正確的軌道上移動它,據我可以告訴XSD:獨特contraint的範圍限定,這取決於元素,你把它放在所以,如果你想要的東西在給定元素1中是唯一的,然後將其放置在element1 xsd:element塊中。

我試過你的例子(在剝離命名空間後承認),如果你移動xsd:unique塊並更新xpaths,它應該如下工作。

<xsd:element name="Root"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type"> 
       <xsd:unique name="uniqueElement2OrderInElement1"> 
        <xsd:selector xpath="./ns:element2" /> 
        <xsd:field xpath="@order" /> 
       </xsd:unique> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType>    
</xsd:element> 
+0

這很好地工作,事後看來(新的一天和所有的)現在是非常明顯的。 感謝您的幫助。 – Nerdio 2013-03-28 10:21:16