Схема XML для начинающих: элемент с атрибутом + тип - PullRequest
0 голосов
/ 28 июня 2010

Давайте посмотрим на мой тест .xsd:

    <!-- lot of stuff... -->
<xsd:element name="root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="target:child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:element name="child">
    <xsd:complexType>
            <xsd:attribute name="childAttribute" type="myType"/>
    </xsd:complexType>
</xsd:element>
    <!-- lot of stuff... -->

Ну, здесь все хорошо. Есть только одна проблема: у моего дочернего элемента нет типа! Я не знаю, как дать элементу тип. Я пробовал с:

<xsd:element name="child" type="xsd:myType2">
    <xsd:complexType>
            <xsd:attribute name="childAttribute" type="myType"/>
    </xsd:complexType>
</xsd:element>

или с

<xsd:element name="root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="target:child" type="xsd:myType2"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Но это не сработает. Всегда есть сообщение об ошибке: «Элемент 'child' не может иметь как атрибут типа, так и дочерний тип simpleType / complexType [xml]]]"

Как я могу исправить эту проблему? Я имею в виду без типа валидатор не разрешит xml, как это:

Привет, мир

допускается только пустой дочерний элемент с одним атрибутом

У кого-нибудь есть идеи? Спасибо!

1 Ответ

1 голос
/ 07 июля 2010

, как говорится в сообщении, вы не можете иметь ни ссылку на тип, ни встроенное определение в одном элементе.Вы должны либо определить «автономный тип» и ссылаться на него с атрибутом типа, либо использовать встроенное определение.Ниже приведен пример:

<!-- inline definition -->
<xsd:element name="child">
    <xsd:complexType>
            <xsd:attribute name="childAttribute" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>

<!-- typed definiotion -->
<xsd:complexType name="typeForChild">
    <xsd:attribute name="childAttribute" type="xsd:string"/>
</xsd:complexType>

<xsd:element name="child" type="typeForChild" />

Также вы, кажется, ссылаетесь на пользовательский тип (myType2) в пространстве имен xsd, что неверно.Ваши типы при объявлении не станут частью пространства имен xsd;они находятся в targetNamespace текущей схемы (таким образом, вы ссылаетесь на них без префикса).С другой стороны, я использую xsd: string, потому что это тип, определенный в собственном пространстве имен shema (xsd в вашем примере).

...