2011-01-16 6 views
2

Возможно, в XML-схеме можно определить один и тот же элемент с несколькими различными определениями в зависимости от одного атрибута.Определение нескольких возможностей для одного и того же элемента

Как пример:

<xsd:element name="Element"> 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:attribute name="type" fixed="type1"/> 
    <xsd:seqeuence> 
    </xsd:complexType> 
</xsd:element> 

<xsd:element name="Element"> 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:attribute name="type" fixed="type2"/> 
    <xsd:attribute name="value" type="xsd:integer"/> 
    <xsd:seqeuence> 
    </xsd:complexType> 
</xsd:element> 

<xsd:element name="RootElement"> 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:element ref="Element"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

Или есть другой способ решить эту проблему. Важно, чтобы оба определения назывались «Element», потому что у меня есть приложение, требующее, чтобы оба элемента назывались одинаково. Но есть второе приложение, которое нуждается в дополнительной информации для type2.

+0

Вы связаны с XML-схемой? –

+0

Да, я связан с XML-схемой. – moggi

ответ

0

Рассмотрите возможность удаления атрибута type и просто определения двух дочерних элементов с различными структурами, которые вы хотите.

Таким образом, вы можете иметь

<Element> 
    <ElementType1> 
    <!--whatever--> 
    </ElementType1> 
</Element> 

и

<Element> 
    <ElementType2 value="42"> 
    <!--whatever--> 
    </ElementType1> 
</Element> 

в том же документе.

Попробуйте это в разделе DTD для Element:

<!ELEMENT Element (ElementType1?)> <!-- the ? means 1 or 0 --> 
<!ELEMENT Element (ElementType2?)> 

или, скорее, это если только один когда-либо разрешено при Element и Element не могут быть пустыми:

<!ELEMENT Element (ElementType1 | ElementType1)> 

Вы можете прочитать подробнее о DTD element operators.

+0

Разве это не значит, что мой парсер больше не будет читать. Я не могу изменить один из парсеров, так что это не будет возможностью. – moggi

0

Если вы используете XML Schema 1.1, вы можете использовать type alternatives. Для XML Schema 1.0 посмотрите на xsi:type или надстройку, как Schematron.

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