XML Schema:如何为每个元素A至少要求一个元素B?

时间:2018-06-14 15:40:36

标签: xml xsd schema xsd-validation

我正在编写一个基于XML文件集合的XML Schema文件。我应该实现的一个要求是,对于每个元素A,必须至少有一个元素B具有匹配的数据。

例如,如果xml文件中有一个元素A,如下所示:

<peanutButterCode>A001</peanutButterCode>

该文件中必须至少有一个匹配元素B,如下所示:

<jellyCode>A001</jellyCode>

有关如何实现此类要求的任何想法,以便任何具有没有对应元素B的元素A的xml文件都无法通过验证?

编辑:更具体地说,下面是一个简化的XML Schema代码片段,我将用它来说明我的问题。它似乎很大但这是我能做到的最小的。

目前,它确保 sr_cat_rel中的每个 category_ref service_ref 元素,有相应的 category_code service_code (位于 配置/类别/类别 配置/ service_requests / service_request 。)。这是通过 配置 下的键/ keyref对完成的。

我在实施时遇到的额外限制与我已经实施的相反;对于每个 category_code service_code ,必须至少有一个相应的 category_ref service_ref 。我不能简单地添加反向键/ keyref对,因为将 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>

1 个答案:

答案 0 :(得分:0)

您可以定义一个键/ keyref对,以确保每个B都有匹配的A和第二个key / keyref对,以确保每个A都有匹配的B。

详细代码将取决于您尚未告诉我们的结构细节。