2010-11-16 3 views
0

В файле XSD У меня есть этот тип элемента базы:XSD: Как установить значения атрибутов в типе дочерних элементов?

<xs:complexType name="event" abstract="true" > 
    <xs:attribute name="move" type="aos:move_ref" use="required" /> 
    <xs:attribute name="type" type="aos:event_type" use="required" /> 
</xs:complexType> 

И я хочу, чтобы определить значение атрибута type в типах детей, поэтому я попытался это:

<xs:complexType name="signal" > 
    <xs:complexContent> 
     <xs:extension base="aos:event"> 
     <xs:attribute name="type" type="aos:event_type" fixed="signal" /> 
     <xs:attribute name="source" type="aos:signal_source" use="required" /> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

Visual Studio кажется, не беспокоит, но CodeSynthesis C++ code generator, кажется, не согласны:

error: attribute 'type' is already defined in base

Как я должен написать это? Я просто хочу, чтобы значение атрибута type было специфичным для каждого другого дочернего типа.

редактировать ----

Чтобы сделать вопрос более ясным, я буду писать то же самое, что я хочу сделать, но в C++.

Вот базовый класс:

class Event 
{ 
public: 

    std::string name() const { return m_name; } 

protected: 

    // we need the child class to set the name 
    Event(const std::string& name) : m_name(name) {} 

    // it's a base class 
    virtual ~Event(){} 

private: 

    std::string m_name; 

}; 

Теперь, один из детей могут быть реализован следующим образом:

class Signal : public Event 
{ 
public: 

    Signal() : Event("signal"){} 

}; 

Как вы можете видеть, дочерний класс определяет значение атрибутов, определяются базовым классом. Можно ли даже выразить в xsd?

+0

вы можете получить нам образец XML, пожалуйста? –

+0

Действительно ли это необходимо? Я могу, но я не понимаю, как это может помочь. Вам нужен какой-то прецедент? – Klaim

+0

Нет, я просто хочу уточнить, непонятно с ур-выражением типа «Я просто хочу, чтобы значение атрибута типа было специфичным для каждого другого дочернего типа», если вы хотите определить атрибут ** по-разному ** под тем же child/entity, тогда это невозможно, так как если вы хотите определить одинаковый атрибут по-разному для разных сущностей/детей, то это вполне возможно. –

ответ

2

Чтобы получить тип и зафиксировать значение, используйте restriction:

<xs:complexType name="signal" > 
    <xs:complexContent> 
     <xs:restriction base="aos:event"> 
     <xs:attribute name="type" type="aos:event_type" fixed="signal" use="required" /> 
     <xs:attribute name="source" type="aos:signal_source" use="required" /> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

От чтения спецификации, я бы ожидал, что вы couldn't add attributes in a restriction, если базовый тип не имел attribute wildcard, но валидатор W3C XSD принимает вышесказанное. Если у вас возникнут проблемы, вы можете разбить определение в ограничение и расширение:

<xs:complexType name="fixedSignalEvent"> 
    <xs:complexContent> 
    <xs:restriction base="aos:event"> 
     <xs:attribute name="type" type="aos:event_type" fixed="signal" use="required" /> 
    </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

<xs:complexType name="signal" > 
    <xs:complexContent> 
    <xs:extension base="aos:fixedSignalEvent"> 
     <xs:attribute name="source" type="aos:signal_source" use="required" /> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

Другого исправление было бы добавить attribute wildcard к базовому типу.

<xs:complexType name="event" abstract="true" > 
    <xs:attribute name="move" type="aos:move_ref" use="required" /> 
    <xs:attribute name="type" type="aos:event_type" use="required" /> 
    <xs:anyAttribute /> 
</xs:complexType> 

Это не эквивалентное решение, так как это позволяет событие иметь ничего для атрибута (который может быть нежелательным, вообще говоря, но, возможно, не для генерации кода), и это не добавляет дополнительный тип (что желательно).

Обратите внимание, что любые частицы (элементы, группы или подстановочные знаки) в базе должны быть repeated in the restriction, иначе они не будут разрешены в элементе. Если на базе требуется ограниченный атрибут, он также должен быть необходим в ограничении. Существует множество других свойств, которые должны быть ограничены, чтобы быть действительными derivation или particle. Спецификация не такая читаемая, но вы можете обычно споткнуться через нее.

См. Также: "how to use restrictions and extensions in XSD simultanously".

+0

Спасибо, я попробую это решение, посмотрим, работает ли оно/подходит. – Klaim

+0

Кажется, что этому парсеру по-прежнему не нравится тот факт, что я повторяю объявление атрибута, даже используя ограничение по расширению (с простым дочерним типом, который пытается установить значение этого атрибута) ... слишком плохо :/ – Klaim

+0

Подождите, я сделал ошибку, похоже, работает! Я не пытался разобрать правильный файл, извините! Мне придется делать больше проверок и делать трюк для более сложных классов детей. – Klaim

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