Ошибка переопределения XML-схемы - PullRequest
1 голос
/ 06 июля 2010

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

Файл: 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 в надеждеизбавиться от ошибки пространства имен, но это тоже не работает.

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

Ответы [ 3 ]

5 голосов
/ 07 июля 2010

Хорошо, мне удалось выяснить это после многих проб и ошибок! Кажется, проблема в том, что в 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 голос
/ 09 июня 2015

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

1 голос
/ 15 августа 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...