我似乎有一个相当不寻常的问题。我有一个看起来大概与他相似的xml:
<?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(子,孙,asf。)的所有后代都是唯一的。到目前为止,我设法验证B的id在A中是唯一的,并且C的id在B内部是唯一的,其中X X看起来像这样:
<?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>
我正在寻找的是类似=&#34; xs:ID&#34;的验证。但不是整个文件,而是仅在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>
答案 0 :(得分:1)
xs:selector
用于选择字段值应该唯一的节点列表。因此,如果您希望 id 在每个 B 和每个 C 中都是唯一的,那么您需要选择选择器中的所有节点。示例(请注意,在XPath中,|
字符表示节点并集):
<xs:selector xpath="tbd:B | tbd:B/tbd:C" />