Можно ли переопределить что-то определенное как xsd:element?

Мне нужно расширить элемент в схеме XSD. В исходной схеме элемент определяется как:

   <xsd:element name="RemarkText">
      <xsd:complexType>
         <xsd:simpleContent>
            <xsd:extension base="C-Infinite">
               <xsd:attribute name="IdRef" type="IDREF" use="required"/>
            </xsd:extension>
         </xsd:simpleContent>
      </xsd:complexType>
   </xsd:element>

Все примеры, которые у меня есть относительно расширений, похоже, имеют дело с расширяющими типами. Если это было первоначально определено как:

      <xsd:complexType name="RemarkText_Type">
         <xsd:simpleContent>
            <xsd:extension base="C-Infinite">
               <xsd:attribute name="IdRef" type="IDREF" use="required"/>
            </xsd:extension>
         </xsd:simpleContent>
      </xsd:complexType>
      <xsd:element name="RemarkText" type="RemarkText_Type"/>

Тогда, я думаю, я бы знал, что делать.

Но можно ли расширить элемент, а не тип?


person pkaeding    schedule 01.05.2009    source источник


Ответы (2)


Тег redefine можно использовать только с group, attributeGroup, complexType и simpleType. . Его невозможно использовать в элементе.

Также невозможно расширить или ограничить элемент. Вы можете расширить или ограничить тип complexType, на котором он основан. Затем вы можете использовать новый тип без изменения исходного определения элемента, добавив xs:type атрибут в xml, чтобы указать, что тип complexType используется. использовал.

alt text
(источник: liquid-technologies.com)

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio - Developer Pro Edition 7.1.1.1206 (http://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="NameType">
    <xs:sequence>
      <xs:element name="FirstName" type="xs:string" />
      <xs:element name="Surname" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="NameExType">
    <xs:complexContent mixed="false">
      <xs:extension base="NameType">
        <xs:sequence>
          <xs:element name="MiddleName" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="MyName" type="NameType" />
</xs:schema>

Но тогда XML должен использовать xsi:type="NameExType", если вы хотите использовать расширенный NameExType.

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio - Developer Pro Edition 7.1.1.1206 (http://www.liquid-technologies.com) -->
<MyName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:type="NameExType">
    <FirstName>string</FirstName>
    <Surname>string</Surname>
    <MiddleName></MiddleName>
</MyName>

Использование графического редактора, такого как Liquid XML Studio, значительно упрощает работу. хотя проще.

person Colin    schedule 04.05.2009
comment
Что ж, это был не тот ответ, на который я надеялся, но спасибо за такой полный ответ (и с такими красивыми картинками)! - person pkaeding; 05.05.2009

Элемент «любой» существует, чтобы помочь с такими проблемами. Хороший пример того, как это сделать, можно найти здесь.

person Dillie-O    schedule 04.05.2009
comment
Разве мне не нужно было бы добавить это к исходной схеме? Я не могу изменить исходную схему (если бы я мог, мне, вероятно, не нужно было бы ее расширять). - person pkaeding; 04.05.2009
comment
По сути, вы создаете новую схему, которая расширит исходную, поскольку вы не можете ее изменить. - person Dillie-O; 04.05.2009