Мы использовали 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>
дочерних элементов сам по себе?