Требовать, чтобы элемент имел другой элемент в качестве потомка - PullRequest
2 голосов
/ 22 июня 2011

Есть ли способ в схеме xsd требовать, чтобы элемент имел другой элемент где-то в качестве потомка?

Например, элемент parent требует потомка desc.Это действительно:

<parent>
  <a>
   <b>
     <desc></desc>
   </b>
  </a>
</parent>

Как это:

<parent>
  <c>
    <desc></desc>
  </c>
</parent>

, но это не так:

<a>
  <parent>
    <b/>
  </parent>
</a>

Потенциальных дочерних элементов для родителя много иусложняет, поэтому было бы сложно перечислить все возможные допустимые конфигурации.

Кажется, что-то вроде элементов схемы ключ / селектор будет работать, где я мог бы предоставить выражение xpath, определяющее допустимые местоположения для элемента desc, но все примеры, которые я нашел, направлены на сопоставлениезначение атрибутов.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Нет, (почти) вся проверка XML-схемы поверхностная, в спецификации она называется "локальной". Вот одна выдержка, которая подчеркивает валидацию типа как «локальную» валидацию.

Элемент проверен по типу Если Элемент информации элемента является · действительным · в отношении · определения типа · как на элемент локально действительный (тип) (§3.3.4), [помечено как] · подтверждено ·.

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

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

Я не знаю, поддерживает ли XSD то, что вы пытаетесь сделать, но есть обходной путь.

Вы можете выполнить сложные проверки с помощью двухэтапного процесса:

  • Сначала просто используйте вашу схему XSD для базовой проверки
  • Затем используйте XSLT, который выполняет более сложные проверки и выводит результат этой проверки

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

В быстром поиске в Google одним из способов достижения этой цели является Schematron. На самом деле он полностью исключает XSD и использует только XSLT. Похоже, что это опубликованный стандарт:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...