Могу ли я установить maxOccurs для элемента XSD в зависимости от значения атрибута родительского узла? - PullRequest
2 голосов
/ 16 сентября 2011

Я хочу определить две структуры xml ниже, используя один XSD.

<grandparent action="SUBMIT">
   <parent>
       <child value="blah"/>
   </parent>
<grandparent>

<grandparent action="CANCEL">
   <parent>
   </parent>
<grandparent>

Правила, которые я хочу применить:

  • Если действие равно "ОТПРАВИТЬ", maxOccurs for <child> должно быть неограниченным
  • Если действие равно "ОТМЕНА", maxOccurs for <child> должно быть 0 (то есть не должно появляться)

Можно ли применять такие правила с помощью XSD?

1 Ответ

2 голосов
/ 16 сентября 2011

Вы не можете делать такие вещи в XSD 1.0 - но вы можете делать в XSD 1.1 (реализовано в настоящее время в последних выпусках Saxon и Xerces).Существует два возможных подхода:

(a) Условное присвоение типа: есть два разных типа для деда и выбор одного из них для проверки на основе значения атрибута

(b) утверждений: оставитьmaxOccurs неограничен в грамматике, и добавьте утверждение для бабушки и дедушки по линиям test="if (@ACTION='cancel') then empty(*/child) else true()"

...