Релакс НГ и уникальность элементов / атрибутов - PullRequest
4 голосов
/ 05 апреля 2011

возможно ли сделать элемент / атрибут Relax NG уникальным?

Например, атрибут:

<rng:attribute name="test">
        <rng:ref name="options"/>
</rng:attribute>

ссылается на:

<rng:define name="options">
    <rng:choice>
        <rng:value>t1</rng:value>
        <rng:value>t2</rng:value>
        <rng:value>t3</rng:value>
    </rng:choice>
</rng:define>

Теперь янеобходимо проверить XML, который не должен использовать один из «вариантов» дважды.Другими словами: в xml не должно встречаться «t1» дважды ...

Я читал кое-что о schematron.Но есть ли другая возможность?

Ответы [ 2 ]

2 голосов
/ 25 мая 2014

Нет, Relax NG не поддерживает ограничения уникальности и ссылочной целостности.Как говорит Джеймс Кларк в статье о дизайне Relax NG :

RELAX NG TC потратил значительное количество времени на рассмотрение поддержки RELAX NG для обеспечения идентичности (уникальность и перекрестные ссылки).В конце концов, был сделан вывод, что ограничения идентичности лучше выделить в отдельную спецификацию.Соответственно, RELAX NG сама по себе не поддерживает ограничения идентичности.

Для совместимости с DTD XML, RelaxNG поддерживает проверку ограничений ID / IDREF.Но это одна из областей, где легче всего столкнуться с несоответствием между процессорами и ввести в заблуждение новых пользователей.

Возможны следующие варианты:

  • проверка уникальности значений вуровень приложения
  • , использующий другой язык схемы (Schematron, DTD, XSD) для формулирования и применения этого ограничения (из них Schematron, вероятно, проще всего использовать на практике как способ дополнить RelaxNG в определенных точках, но оставить большинствоработы по RelaxNG)
  • перенастройка XML так, чтобы различие между t1, t2 и t3 выражалось в именах элементов, а модель контента могла обеспечивать их уникальность;это не обязательно возможно
0 голосов
/ 23 мая 2011

Ваши фрагменты схемы в порядке как есть.

Схема:

<?xml version="1.0"?>
<rng:element xmlns:rng="http://relaxng.org/ns/structure/1.0" name="doc">
  <rng:attribute name="test">
    <rng:choice>
      <rng:value>t1</rng:value>
      <rng:value>t2</rng:value>
      <rng:value>t3</rng:value>
    </rng:choice>
  </rng:attribute>
</rng:element>

позволяет атрибуту теста иметь значение "t1", "t2" или "t3».Если он содержит что-либо еще, валидатор RELAX NG выдаст сообщение об ошибке валидации.Например, в этом случае jing сообщает

"[Jing] value of attribute "test" is invalid; must be equal to "t1", "t2" or "t3"
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...