XSD для XML-файла, в котором за xs:all следует xs:choice или xs:sequence

У меня есть файл XML, который выглядит следующим образом:

<root>
    <node1></node1>
    <node2></node2>
    <node3></node3>
    <line>
       <line1></line1>
       <line2></line2>
       <line3></line3>
    </line>
    <line>
       <line1></line1>
       <line2></line2>
       <line3></line3>
    </line>
</root>

Вот мои ограничения:

  • <node1>,<node2>,<node3> должны встречаться ровно один раз и могут встречаться в любом порядке
  • <node1>,<node2>,<node3> должны быть до начала <line> элементов
  • Элементов <line> может быть произвольное количество, но должен быть хотя бы один
  • <line1>,<line2>,<line3> элементы в <line> должны встречаться ровно один раз и могут встречаться в любом порядке
  • У меня нет контроля над XML. Его дает мне какое-то стороннее программное обеспечение.
  • Я должен использовать XSD 1.0.
  • Это упрощенный пример. Я смотрю на 20 или около того уникальных <node#>, поэтому решение должно хорошо масштабироваться.

Я пытаюсь создать файл XSD для проверки этого XML, но безрезультатно. Проблема в том, что я, по сути, смотрю на блок <xs:all> (для моих <node#>s), за которым следует блок <xs:sequence> или <xs:choice> с maxOccurs="unbounded" (для моих <line>s), но кажется, что нет никакого правильного способа сделать это с XSD 1.0.


person 123MilitaryNerd    schedule 25.04.2014    source источник


Ответы (1)


Существует только шесть возможных последовательностей (1,2,3), встречающихся по одному разу в любом порядке, поэтому можно перечислить их все. Конечно, это не масштабируется, но это может сработать для вас. Это было бы

(1((2,3)|(3,2)) | 2((1,3)|(3,1)) | 3((1,2)|(2,1))

используя "," для последовательности и "|" на выбор.

Ваши единственные другие варианты - это не XSD 1.0. Например. XSD 1.1 или схематрон.

person Michael Kay    schedule 25.04.2014
comment
Нет, он плохо масштабируется, а мне нужно, чтобы он хорошо масштабировался. Мой пример выше был упрощен. Жаль, что XSD 1.0 так ограничивает, тем более, что кажется, что такая ситуация может возникнуть часто. Однако я рад, что XSD 1.1 попытался решить некоторые из этих проблем. - person 123MilitaryNerd; 26.04.2014
comment
В XSD (и, возможно, в других языках схем) существует очень сильная культура, которая гласит: вот набор инструментов для разработки хороших XML-документов. Используйте их для оформления документа. В отличие от: спроектируйте свой документ так, как вам нравится, а затем используйте наши инструменты для описания вашего дизайна — это то, что вы пытаетесь сделать. - person Michael Kay; 26.04.2014
comment
Я понимаю. Если бы у меня была возможность самостоятельно разработать XML-документ, я бы сделал это гораздо более удобным для XSD способом. Я узнаю, что язык предполагает, что создатель XSD также является создателем XML, что здесь не так. - person 123MilitaryNerd; 26.04.2014