Что если подэлемент используется двумя другими независимыми элементами при использовании RELAX NG Compact?

Я использую RELAX NG Compact и натолкнулся на случай, когда подэлемент используется двумя независимыми родительскими элементами. Как я могу решить это?

Вариант использования 1

<parent1>
  <field usecase_123="test" />
</parent1>

Вариант использования 2

<parent2>
  <field usecase_AAA="test" />
</parent2>

В этом и заключается конфликт:

parent1 = element parent1 { element field { attribute usecase_123 {text} } }

parent2 = element parent2 { element field { attribute usecase_AAA {text} } }

1 ответ

Решение

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

Таким образом, вы можете иметь грамматику RelaxNG следующим образом:

start = root
root = element root { parent1* & parent2* }
parent1 = element parent1 { element field { attribute usecase_123 {text} } }
parent2 = element parent2 { element field { attribute usecase_AAA {text} } }

И, действительный в отношении этой грамматики, следующий экземпляр документа:

<root>
  <parent1>
    <field usecase_123="test" />
  </parent1>
  <parent2>
    <field usecase_AAA="test" />
  </parent2>
</root>

... while, недопустимо для этой грамматики, следующий экземпляр документа:

<root>
  <parent1>
    <field usecase_AAA="test" />
  </parent1>
</root>
Другие вопросы по тегам