XSD 验证 parent 中 n-th child 的唯一 ID 属性
XSD to validate unique id attribute within a parent for n-th child
我似乎遇到了一个不寻常的问题。我有一个 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 的所有后代都是唯一的(child、grandchild、asf.)。到目前为止,我设法验证了 B 的 ID 在 A 内部是唯一的,并且 C 的 ID 在 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>
我正在寻找的是类似 type="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>
xs:selector
用于 select 字段值应该唯一的节点列表。因此,如果您希望 id 在每个 B 和每个 C 中都是唯一的,那么您需要 select selector 中的所有节点。示例(请注意,在 XPath 中,|
字符表示节点并集):
<xs:selector xpath="tbd:B | tbd:B/tbd:C" />
我似乎遇到了一个不寻常的问题。我有一个 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 的所有后代都是唯一的(child、grandchild、asf.)。到目前为止,我设法验证了 B 的 ID 在 A 内部是唯一的,并且 C 的 ID 在 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>
我正在寻找的是类似 type="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>
xs:selector
用于 select 字段值应该唯一的节点列表。因此,如果您希望 id 在每个 B 和每个 C 中都是唯一的,那么您需要 select selector 中的所有节点。示例(请注意,在 XPath 中,|
字符表示节点并集):
<xs:selector xpath="tbd:B | tbd:B/tbd:C" />