XSD: как проверить, что только последний элемент содержит атрибуты - PullRequest
0 голосов
/ 14 июля 2020

У меня есть XML документ:

<Feature> 
    <Filter> ... </Filter>
    <Filter> ... </Filter>
    <Filter isTargetFilter="true"> ... </Filter>
</Feature>

Функция может содержать не более 3 элементов фильтра.

Используя XSD, я хочу проверить, что только последний элемент фильтра будет содержать атрибут " isTargetFilter ".

Никакой другой элемент Filter не может содержать этот атрибут.

Я не нашел ни одного XSD-выражения, которое могло бы мне помочь.

Любые указатели приветствуются.

1 Ответ

0 голосов
/ 14 июля 2020

В XSD (как 1.0, так и 1.1), если два элемента являются одноуровневыми и имеют одно и то же имя, то они должны иметь один и тот же тип. (Ограничение называется Согласованные объявления элементов , если вы хотите его найти).

Таким образом, единственный способ сделать это - использовать утверждения XSD 1.1. Определите утверждения в элементе Feature:

<xs:assert test="every $f in Filter[not(position()=last())] satisfies empty(@isTargetFilter)"/>
<xs:assert test="Filter[position()=last()][@isTargetFilter]"/>
...