#xml #xsd
#xml #xsd
Вопрос:
В моем домашнем проекте университета мне нужно написать XSD (XML-схему), которая описывает, какие элементы будут иметь школьную историю. В одном из случаев у меня есть элемент «Disciplina», который имеет атрибут «categoria» (пример приведен ниже):
<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».
Но, когда «категорией» является «atividade academica», я хочу ограничить возможные значения элемента «situacao» только «AC» или «NC», в противном случае значениями ограничения будут «AP», «RM», «RF», «ED», «AB», «AE», «AI», «TR», «TD», «RI», «IN». Приведенный ниже 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-схеме?
Ответ №1:
Это невозможно сделать в 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'))...."/>
(b) условное присвоение типа, используя xs:alternative
: идея здесь в том, чтобы определить тип элемента как функцию значений его атрибутов; опять же, это делается с использованием выражений XPath.