XSD конкретные элементы в другом положении - PullRequest
0 голосов
/ 25 января 2019

Проблема, с которой я столкнулся, заключается в создании правильной схемы XSD для моего XML

У меня есть следующий 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 голосов
/ 25 января 2019

Вы можете сделать это в XSD 1.1, используя xs:all с minOccurs / maxOccurs для частиц содержащегося элемента.

В XSD 1.0 вы можете определить модель контента как

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

но это позволяет обнулять RouteNo's. Вы можете обойти это с моделью контента

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
...