Как реализовать ограничения / условные операторы в Relax NG? - PullRequest
1 голос
/ 15 июля 2011

Рассмотрим следующую схему Relax NG , написанную на Компактный синтаксис

key = element key { type, value }
type = element type { text }
value = element value { text }

Таким образом, любой XML-документ, такой как

 <key>
    <type>someType</type>
    <value>someValue</value>
 </key>

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

if type:text = "digit"  then value:text = "[0-9]" else
if type:text = "letter" then value:text = "[a-z]"

Это отфильтрует некоторые недействительные документы, такие как

<key>
   <type>letter</type>
   <value>7</value> 
</key>
<!-- illegal - 7 is not a letter ! -->

Синтаксис Relax NG не предоставляет явного механизма написания условных операторов, поэтому мой вопрос заключается в том, какэмулировать такое поведение и реализовать зависимость между значениями некоторых элементов и атрибутов?

Также я буду благодарен, если вы покажете мне способ сделать это, используя классический DTD.

Любая помощь будет оценена.Заранее спасибо.

1 Ответ

2 голосов
/ 16 июля 2011

Эта схема:

start = key
key = element key { (type1, value1) | (type2, value2) }

type1 = element type { "letter" }
type2 = element type { "digit" } 

value1 = element value { xsd:string { pattern = "[a-z]" }}
value2 = element value { xsd:string { pattern = "[0-9]" }}

может использоваться для проверки этого документа:

<key>
  <type>letter</type>
  <value>7</value>
</key>

Jing отчеты:

so.xml: 3: 20: ошибка: символьное содержимое элемента «значение» недопустимо;должна быть строкой, соответствующей регулярному выражению "[az]"

...