2010-06-28 5 views
0

Давайте посмотрим на мой тест .xsd:начальный XML Schema: элемент с атрибутом + Тип

<!-- 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> 

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

Как исправить эту проблему? Я имею в виду без типа валидатор не позволит XML-как это:

Hello World

просто пустой ребенок может с одним атрибутом

Somebody любая идея? Спасибо!

ответ

1

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

<!-- 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 текущей shema (таким образом, вы ссылаетесь на них без какого-либо префикса). С другой стороны, я использую xsd: string, потому что это тип, определенный в собственном пространстве имен shema (xsd в вашем примере).

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