我正在编写一个基于XML文件集合的XML架构文件。我应该实现的一个要求是,对于每个元素 A,必须至少有一个元素 B 具有匹配的数据。
例如,如果 xml 文件中有一个元素 A,如下所示:
<peanutButterCode>A001</peanutButterCode>
该文件中必须至少有一个匹配的元素 B,如下所示:
<jellyCode>A001</jellyCode>
关于如何实现这样的要求的任何想法,以便任何具有元素 A 但没有相应元素 B 的 xml 文件都无法通过验证?
编辑:更具体地说,下面是一个简化的XML架构代码片段,我将用它来说明我的问题。它看起来很大,但这是我能做的最小的。
目前,它确保对于sr_cat_rel元素中的每个category_ref和service_ref,都有一个相应的category_code和service_code(分别位于配置/类别/类别和配置/service_requests/service_request下(。这是通过配置下的密钥/密钥引用对完成的。
我在实现时遇到的额外约束与我已经实现的约束相反;对于每个category_code和service_code,必须至少有一个相应的category_ref和service_ref。我不能简单地添加反向键/键引用对,因为将category_ref和service_ref作为键要求它们是唯一的。但是,与category_code和service_code不同,它们不应该是。它们可以在sr_cat_rel元素中单独重复,但每一对都是唯一的。这个警告,加上语言中愚蠢的规则,阻止了我找到实现这个约束的方法,这应该不是不可能。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://311selfserviceconfig.com" xmlns:tns="http://311selfserviceconfig.com" elementFormDefault="qualified">
<element name="configuration" type="tns:configuration">
<key name="categoryCodeKey">
<selector xpath="tns:categories/tns:category"/>
<field xpath="tns:category_code"/>
</key>
<key name="serviceCodeKey">
<selector xpath="tns:service_requests/tns:service_request"/>
<field xpath="tns:service_code"/>
</key>
<keyref name="categoryCodeKeyRef" refer="tns:categoryCodeKey">
<selector xpath="tns:service_request_category_relation/tns:sr_cat_rel"/>
<field xpath="tns:category_ref"/>
</keyref>
<keyref name="serviceCodeKeyRef" refer="tns:serviceCodeKey">
<selector xpath="tns:service_request_category_relation/tns:sr_cat_rel"/>
<field xpath="tns:service_ref"/>
</keyref>
</element>
<complexType name="configuration">
<sequence>
<element name="categories" type="tns:categories" maxOccurs="1" minOccurs="1"></element>
<element name="service_requests" type="tns:service_requests" maxOccurs="1" minOccurs="1"></element>
<element name="service_request_category_relation"
type="tns:service_request_category_relation" maxOccurs="1" minOccurs="1"></element>
</sequence>
</complexType>
<complexType name="categories">
<sequence>
<element name="category" type="tns:category" maxOccurs="unbounded" minOccurs="1"></element>
</sequence>
</complexType>
<complexType name="category">
<sequence>
<element name="category_code" type="string" maxOccurs="1" minOccurs="1"></element>
<!-- Irrelevant other child elements -->
</sequence>
</complexType>
<complexType name="service_requests">
<sequence>
<element name="service_request" type="tns:service_request" maxOccurs="unbounded" minOccurs="1"></element>
</sequence>
</complexType>
<complexType name="service_request">
<all>
<element name="service_code" type="string" maxOccurs="1" minOccurs="1"></element>
<!-- Misc other child elements -->
</all>
</complexType>
<complexType name="service_request_category_relation">
<sequence>
<element name="sr_cat_rel" type="tns:sr_cat_rel" maxOccurs="unbounded" minOccurs="1"></element>
</sequence>
</complexType>
<complexType name="sr_cat_rel">
<sequence>
<element name="category_ref" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="service_ref" type="string" maxOccurs="1" minOccurs="1"></element>
</sequence>
</complexType>
</schema>
您可以定义一个键/键引用对,以确保每个 B 都有一个匹配的 A,以及第二个键/键引用对,以确保每个 A 都有一个匹配的 B。
详细的代码将取决于您尚未告诉我们的结构的详细信息。