2009-06-09 2 views
4

Возможно ли создать XML-схему со следующим поведением? У меня есть XML-файл, который выглядит следующим образом. Я хотел бы либо выставить, либо ограничить атрибуты объекта на основе значения Type. Например, если Type = «Bike», мне может понадобиться выставить атрибуты, относящиеся только к Bike (например, к педалям, кадру и т. Д.). Если Type = «Автомобиль», я могу выделить атрибуты, которые относятся только к автомобилю (т. Е. Make, Model, Miles и т. Д.).Разрешение/ограничение атрибутов атрибутов на основе атрибутов XML

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

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

ответ

4

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

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

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

+1

Я не уверен, есть ли какие-либо технические резоны, почему это было бы невозможно - это абсолютно правильный подход и даже был специально адресован W3C, хотя я изо всех сил пытаюсь найти документ. – annakata

+0

«если это возможно», я имел в виду «для вашего сценария» ;-p –

2

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

+0

+1 точно так – annakata

+0

Старая нить, но почему? Они простые значения, почему должны быть элементы вместо атрибутов? –

+0

@Josh - http://www.w3schools.com/DTD/dtd_el_vs_attr.asp <- Я согласен с этими пунктами. – dss539

0

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

0

Да, вы просто должны использовать 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 Schema Part 0: Primer. У этого есть example schema для этого, в котором USAddress и UKAddress Типы производные от Адрес. Далее вниз находится example instance, используя xsi:type.

Смежные вопросы