Варьировать тип в XSD в соответствии со значением элемента? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть два следующих XML-документа:

<struct>
<type>a</type>
<p1 xsi:nil="true"/>
<p2 xsi:nil="true"/>
</struct>

<struct>
<type>b</type>
<p1 xsi:nil="true"/>
<p2 xsi:nil="true"/>
</struct>

Я хочу построить схему, которая проверяет, что в случае, если значение типа элемента равно «a», тогда его подэлементы (aka p1 & p2) должны быть нулевыми или пустыми. Принимая во внимание, что когда тип элемента является чем-то еще, таким как "b", тогда элементы p1 или p2 могут содержать что-либо или ничего.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Это классический пример «ограничения совместного использования» (тип одного элемента зависит от значения другого). Этого нельзя сделать с помощью XSD 1.0, но это можно сделать с помощью XSD 1.1 с помощью утверждений

<xs:assert test="if (type eq 'a') then nilled(p1) else true()"/> 
0 голосов
/ 29 августа 2018

Ваш XML-дизайн не идеален.

Элемент не должен называться так же обобщенно, как struct, если вы хотите дополнительно ограничить его содержимое.

Вместо

<struct>
  <type>a</type>
  <p1/>
  <p2/>
</struct>

использование

<a>
  <p1/>
  <p2/>
</a>

и у вас не возникнет проблем при написании XSD.

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

Смотри также:

...