Как ограничить значения элемента в соответствии со значением его атрибута

#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.