Могу ли я выразить «может / не может содержать» правила, охватывающие несколько уровней в XML-схеме? - PullRequest
0 голосов
/ 22 июня 2009

У меня есть иерархия объектов, которые передаются через XML. Правила иерархии легко выразить в XML-схеме, указав, какой элемент может содержать какие дочерние элементы. Упрощенным примером данных XML будет (фактические данные объекта содержатся в атрибутах и ​​для краткости опущены):

<root>
  <channel>
    <router>
      <message />
      <message />
      <message />
    </router>
    <router>
      <message />
      <message />
    </router>
  </channel>
  <channel></channel>
</root>

Теперь я хотел бы представить «папки», т.е. е. узлы, которые просто служат для структурирования длинных списков детей для более удобного использования. Если я сделаю общий элемент <folder>, он не будет навязывать свои собственные правила, а наследует их от следующего элемента, не являющегося папкой, вверх по дереву.

Мне кажется, что я не могу выразить это в XSD, или я могу?

Я могу придумать альтернативы, например, иметь определенные элементы папки для каждого возможного правила (безобразно), просто игнорировать правила в XSD и применять их в коде (хорошо для меня) или как-то разделять иерархию объектов и промежуточные узлы в XML ( не совсем уверен, как). Буду признателен за ваши комментарии, если у вас есть какие-либо комментарии.

1 Ответ

1 голос
/ 22 июня 2009

Вы правы, что то, что вы хотите, не может быть выражено в XSD. Можно было бы ввести одноуровневые папки, или, в более общем случае, папки n-уровня, но не произвольно-рекурсивные (поскольку они должны были бы быть глобальными элементами, которые затем не знали бы, что они содержатся в ).

В можно выразить такое ограничение в Schematron ; в свою очередь, можно было бы встроить ограничение схематурона в элемент appinfo XSD. Ваш валидатор может поддерживать или не поддерживать Schematron, встроенный в XSD.

...