В моем домашнем проекте университета мне нужно написать XSD (схему XML), которая описывает, какие элементы будут иметь школьную историю. В одном из случаев у меня есть элемент «Дисциплина», который имеет атрибут «категория» (пример ниже):
<Disciplina categoria = "atividade academica">
(...other elements here...)
<situacao>AC</situacao>
</Disciplina>
Кроме того, элемент "situacao" имеет диапазон по некоторым конкретным строковым значениям: "AP,RM,RF,ED,AB,AE,AI,TR,TD,RI,IN" и "categoria" - та же логика: " obrigatoria, optativa, livre escolha, atividade Academica».
Но когда "categoria" - "atividade Academica", я хочу ограничить возможные значения элемента "situacao" только "AC" или "NC", в противном случае значения ограничения будут "AP", "RM" ,"РФ","ЭД","АБ","АЭ","АИ","ТР","ТД","РИ","ВО". Приведенный ниже xml выражает высокий уровень идеи, которую я пытаюсь представить:
<element>
<name>situacao</name>
<type>String</type>
<range>AP,RM,RF,RF,ED,AB,AE,AI,TR,TD,RI,IN</range>
<range categoria = "atividade academica">AC,NC</range>
</element>
Мой вопрос: Как я могу представить это изменение ограничения значений «situacao» в соответствии со значением «categoria» в XML-схеме?
Это невозможно сделать в XSD 1.0 (эта версия поддерживается многими процессорами XSD, например, от Microsoft). В XSD 1.1 (поддерживается Xerces, Saxon и Altova) это можно сделать двумя способами:
(a) утверждения общего назначения, например
<xs:assert test = "(@categoria = 'atividade academia' and situacio = ('AC', 'NC'))
or (@categoria = 'xxxx' and situacio = ('ED', 'AB'))...."/>
(б) условное присвоение типа с использованием xs:alternative
: идея здесь состоит в том, чтобы определить тип элемента как функцию значений его атрибутов; опять же это делается с помощью выражений XPath.