XSD 不同位置的特定元素

XSD specific elements in different position

我面临的问题是为我的 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的Unbounded number。

主要挑战是设置必填字段并允许放置 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 放在我的列表末尾并不灵活。

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

您可以在 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