2010-07-06 2 views
1

Я пытаюсь переопределить атрибут элемента в простой XML-схеме, используя Eclipse WTP-плагин в качестве моей IDE.Ошибка преобразования кода XML

Файл: widget1.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.example.org/widget" 
    elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://www.example.org/widget"> 

    <xsd:complexType name="WidgetType"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"/> 
     <xsd:element name="ProductID" type="xsd:unsignedInt"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:element name="Widgets"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Widget" type="tns:WidgetType" minOccurs="1" maxOccurs="65536"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

Файл: widget2.xsd В этом файле я хочу переопределить атрибут maxOccurs для Widget до 10.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.example.org/widget" elementFormDefault="qualified" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.org/widget"> 

    <xsd:include schemaLocation="widget1.xsd"/> 

    <xsd:redefine schemaLocation="widget1.xsd"> 
    <xsd:complexType name="Widgets"> 
     <xsd:complexContent> 
     <xsd:restriction base="Widgets"> 
      <xsd:sequence> 
      <xsd:element name="tns:Widget" maxOccurs="10"/> 
      </xsd:sequence> 
     </xsd:restriction> 
     </xsd:complexContent> 
    </xsd:complexType> 
    </xsd:redefine> 

</xsd:schema> 

Однако проверка не пройдена на WIDGET2 .xsd и Eclipse сообщает об этой ошибке

Multiple annotations found at this line:

- src-resolve.4.1: Error resolving component 'Widgets'. It was detected that 'Widgets' has no namespace, but components with no target namespace are not referenceable from schema document 'file:///C:/Projects/Test/XMLSchema/Widget/widget2.xsd'. If 'Widgets' is intended to have a namespace, perhaps a prefix needs to be provided. If it is intended that 'Widgets' has no namespace, then an 'import' without a "namespace" attribute should be added to 'file:///C:/Projects/Test/XMLSchema/Widget/widget2.xsd'. 

    - src-redefine.5.b.d: 'restriction' does not have a 'base' attribute that refers to the redefined element, 'http://www.example.org/widget,Widgets'. <complexType> children of <redefine> elements must have <extension> or <restriction> descendants, with 'base' attributes that refer to themselves. 

Я попытался заменить Widgets в <redefine> с tns:Widgets в надежде избавиться от ошибки пространства имен, но это не работает.

Что означает эта ошибка? И что я пытаюсь сделать вообще?

+0

Redefine являются плохо поддерживается и добавляет много сложностей в набор схем, если это вообще возможно, я бы не использовал их. – Sprotty

ответ

5

Хорошо, мне удалось выяснить это после много проб и ошибок! Проблема заключается в том, что в widget1.xsd тип для элемента Widgets создавался как анонимный локальный тип. Как только я разделил тип на свой собственный локальный WidgetsType, он исправил проблему. Я был бы признателен, если бы кто-нибудь мог ответить, почему. Я вставляю измененные файлы, возможно, это поможет кому-то другому.

Файл: widget1.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.example.org/widget" 
    elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://www.example.org/widget"> 

    <xsd:complexType name="WidgetType"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"/> 
     <xsd:element name="ProductID" type="xsd:unsignedInt"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="WidgetsType"> 
    <xsd:sequence> 
     <xsd:element name="Widget" type="tns:WidgetType" minOccurs="1" maxOccurs="65536"/> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:element name="Widgets" type="tns:WidgetsType"/> 

</xsd:schema> 

Файл: widget2.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.example.org/widget" 
    elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://www.example.org/widget"> 

    <xsd:redefine schemaLocation="widget1.xsd"> 
    <xsd:complexType name="WidgetsType"> 
     <xsd:complexContent> 
     <xsd:restriction base="tns:WidgetsType"> 
      <xsd:sequence> 
      <xsd:element name="Widget" type="tns:WidgetType" maxOccurs="10"/> 
      </xsd:sequence> 
     </xsd:restriction> 
     </xsd:complexContent> 
    </xsd:complexType> 
    </xsd:redefine> 

    <xsd:element name="Widgets" type="tns:WidgetsType" /> 

</xsd:schema> 
1

Первый включает в свой первый пост ист не допускается. Переопределить такие действия, как включить тоже.

И вы должны объявить, тип в вашем переопределенном элементе. Вы не можете просто сделать его анонимным.

1

Ваше решение работает, потому что в оригинальных widget2.xsd ваших попытаться redefine элемент Widgets», но переопределять только позволяет переопределить типы ... это то, что вы пытались в своем решении.

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