Нужна небольшая рекурсия в RELAX NG по внешним ссылкам - PullRequest
0 голосов
/ 02 февраля 2012

Мы использовали RELAX NG для определения и проверки XML-сообщений для нашего веб-API, и я провел некоторую уборку и начал использовать элемент <external>.

В наших схемах у нас есть элемент <subscription>, который имеет такие вещи, как id, точка и т. Д., А также <account>. Это довольно просто для спецификации в RELAX NG:

<?xml version="1.0"?>
<element name="subscription" xmlns="http://relaxng.org/ns/structure/1.0">
  <element name="id">
    <text />
  </element>

  <zeroOrMore>
    <externalRef href="./account.xml" />
  </zeroOrMore>
</element>

Эта схема будет затем включена в фактическую схему сообщения для конкретного запроса.

Проблема в том, что элемент <account> может также иметь количество элементов <subscription> в зависимости от запроса (например, иногда мы ищем данные подписки на основе информации об учетной записи, а иногда мы ищем учетную запись). информация на основе данных подписки).

Я пытался:

<?xml version="1.0"?>
<element name="account" xmlns="http://relaxng.org/ns/structure/1.0">
  <element name="id">
    <text />
  </element>

  <zeroOrMore>
    <externalRef href="./subscription.xml" />
  </zeroOrMore>
</element>

Но я получил (не неожиданную) ошибку при загрузке схемы: Detected an externalRef recursion

Есть ли способ указать какой-то предел рекурсии - какой-то способ узнать, что мой текущий <subscription> является дочерним элементом <account> и поэтому не должен иметь <account> дочерних элементов сам по себе?

1 Ответ

1 голос
/ 16 февраля 2012

Пока вы указываете на элемент subscription, определенный в вашем первом Relax NG, субстраница должна соответствовать шаблону, на который вы указываете.

Для достижения вашей цели у вас должно быть другое определение шаблона для другого элемента subscription с другой подструктурой.

Что-то вроде:

<define name="subscriptionDEF-2">
    <element name="subscription">
        <text/>
    </element>
</define>

И обратитесь кот вашего account элемента с ref элементом.

<element name="account">
    <ref name="subscriptionDEF-2"/>
</element>
...