XSD特定元素在不同位置

时间:2019-01-25 12:01:34

标签: xml xsd xsd-validation

我面临的问题是为我的XML构建正确的XSD架构

我有以下XML:

<VanToRoute>
   <VanId>1111</VanId>
   <RouteNo>1459</RouteNo>
   <RouteNo>1458</RouteNo>
   <RouteNo>2459</RouteNo>
   <RouteNo>1THU</RouteNo>
</VanToRoute>
<VanToRoute>
   <RouteNo>2458</RouteNo>
   <VanId>2222</VanId>
   <RouteNo>1457</RouteNo>
   <RouteNo>1NEW</RouteNo>
   <RouteNo>2NEW</RouteNo>
</VanToRoute>
<VanToRoute>
   <RouteNo>1215</RouteNo>
   <RouteNo>2457</RouteNo>
   <VanId>2222</VanId>
</VanToRoute>
<VanToRoute>
   <VanId>4444</VanId>    
   <RouteNo>2456</RouteNo>
   <RouteNo>1100</RouteNo>
   <RouteNo>2465</RouteNo>
</VanToRoute>

因此,关键是要具有VanId的必填字段和RouteNo的无限制数量。

主要挑战是使用允许的XML元素放置来设置必填字段。

到目前为止我所做的:

 <xs:element minOccurs="1" maxOccurs="unbounded" name="VanToRoute">
      <xs:complexType>
            <xs:sequence> 
                <xs:choice> 
                     <xs:element minOccurs="1" name="VanId" type="xs:unsignedshort" /> 
                     <xs:element minOccurs="1" name="RouteNo" type="xs:string" /> 
                </xs:choice> 
                <xs:choice>
                      <xs:element minOccurs="1" name="RouteNo" type="xs:string" /> 
                      <xs:element minOccurs="1" name="VanId" type="xs:unsignedshort" /> 
                </xs:choice> 
                <xs:sequence>
                      <xs:element minOccurs="0" maxOccurs="unbounded" name="RouteNo" type="xs:string" /> 
               </xs:sequence> 
           </xs:sequence> 
      </xs:complexType>
 </xs:element>  

但是由于以下几个原因,此解决方案不正确:

  1. 允许复制不正确的VanId
  2. 将VanId放在列表的末尾并没有带来灵活性。

我的问题是-是否甚至可能以某种方式模仿我想加入的逻辑?

1 个答案:

答案 0 :(得分:1)

您可以在XSD 1.1中使用xs:allminOccurs / maxOccurs对所包含的元素粒子进行此操作。

在XSD 1.0中,您可以将内容模型定义为

sequence
  RouteNo occurs 0 to many
  VanId
  RouteNo occurs 0 to many

但是这允许零RouteNo。您可以使用内容模型解决这个问题

choice
  sequence
    RouteNo occurs 1 to many
    VanId
    RouteNo occurs 0 to many
or
  sequence
    RouteNo occurs 0 to many
    VanId
    RouteNo occurs 1 to many