Разрешение / ограничение атрибутов XML на основе других атрибутов - PullRequest
4 голосов
/ 09 июня 2009

Можно ли создать схему XML со следующим поведением? У меня есть файл XML, который выглядит следующим образом. Я хотел бы выставить или ограничить атрибуты объекта на основе значения типа. Например, если Type = "Bike", я могу указать атрибуты, относящиеся только к Bike (например, педали, рамка и т. Д.). Если Type = "Car", я могу указать атрибуты, относящиеся только к Car (например, Марка, Модель, Мили и т. Д.).

<Objects>
  <Object Type="Bike" Pedals="XXX" Frame="XXX" />
  <Object Type="Car" Make="XXX" Model="XXX" Miles="XXX" />
</Objects>

Заранее спасибо за любую помощь. Дайте мне знать, если у вас есть какие-либо вопросы.

Ответы [ 4 ]

4 голосов
/ 09 июня 2009

Насколько я понимаю, это выходит за рамки того, что вы можете сделать с xsd. Кроме того, это делает запрос кошмаром. Предпочтительный подход (если это возможно) заключается в использовании:

<vehicles>
  <bike pedals="XXX" frame="XXX" />
  <car make="XXX" model="XXX" miles="XXX" />
</vehicles>

Где car и bike предположительно имеют общий корень vehicle в xsd, но имеют свои специфические свойства (поверх унаследованных).

2 голосов
/ 09 июня 2009

Я думаю, вы слишком много вбиваете в атрибуты. Такие вещи, как педали и рамка, вероятно, должны быть элементами.

0 голосов
/ 10 июня 2009

Да, вам просто нужно использовать xsi:type вместо Type для полиморфизма XSD (и в схеме извлекать типы из общего типа):

<Objects>
  <Object xsi:type="Bike" Pedals="XXX" Frame="XXX" />
  <Object xsi:type="Car" Make="XXX" Model="XXX" Miles="XXX" />
</Objects>

Подробнее см. XML-схема, часть 0: учебник . Для этого он имеет пример схемы , в которой типы USAddress и UKAddress получены из Address . Далее приведен пример экземпляра с использованием xsi:type.

0 голосов
/ 09 июня 2009

Я согласен с Марком , что то, что вы пытаетесь сделать, находится за пределами возможностей XML-схемы W3C. Я также согласен, что ваша модель данных немного перегружена / неоднозначна, чтобы быть полезной. Тем не менее, если у вас нет выбора в этом вопросе, то, возможно, Schematron или Relax-NG может обеспечить работоспособное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...