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的模式中,但我試圖將它移到更加本地化的位置,或者使選擇器更具體,並且它不起作用(我得到錯誤)。
正在嘗試做什麼?
在期待非常感謝
這很好地工作,事後看來(新的一天和所有的)現在是非常明顯的。 感謝您的幫助。 – Nerdio 2013-03-28 10:21:16