我需要强制元素属性的唯一性,但仅限于父元素的范围内。以下是有效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>
上面注意到,有两组'element1',其中element2节点有一个名为'order'的属性。要求是'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>
我已经写了以下Schema来为我做这个;
<?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的架构中,但我试图将其移动到更本地化的位置,或者使选择器更具体,但它不起作用(我得到错误)。
我正在尝试做什么?
非常感谢期待
答案 0 :(得分:3)
你是在正确的轨道移动它,据我所知告诉xsd:唯一的约束是根据你放置它的元素确定范围。所以,如果你想在给定的element1中有一些独特的东西,那么将它放在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>