2009-05-01 2 views
1

Ich muss ein Element in einem XSD-Schema erweitern. Im ursprünglichen Schema wird das Element wie folgt definiert:Ist es möglich, etwas, das als xsd: element definiert ist, neu zu definieren?

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

die Beispiele Alles, was ich scheinen haben in Bezug auf Erweiterungen scheinen mit der Erweiterung Typen zu behandeln. Wenn das ursprünglich definiert wurde als:

 <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"/> 

Dann denke ich, ich würde wissen, was zu tun ist.

Aber ist es möglich, ein Element statt einen Typ zu erweitern?

Antwort

5

Die neu definieren Tag kann nur mit Gruppe, attribute, complex und simple verwendet werden. Es ist nicht möglich, es auf einem Element zu verwenden.

Es ist auch nicht möglich, ein Element zu erweitern oder einzuschränken. Sie können den complexType, auf dem er basiert, erweitern oder einschränken. Sie können dann den neuen Typ verwenden, ohne die ursprüngliche Elementdefinition zu ändern, indem Sie das xs: typeAttribut in der XML-Datei hinzufügen, um den Typ complexType anzugeben, der verwendet wird.

alt text http://www.liquid-technologies.com/images/blogs/stackoverflow/redefine.png

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

Aber dann muss der XML die xsi verwenden: type = "NameExType", wenn Sie die erweiterte NameExType verwenden möchten.

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

einen grafischen Editor wie Liquid XML Studio Verwendung macht die Dinge viel einfacher obwohl.

+1

Nun, das war nicht die Antwort, auf die ich gehofft hatte, aber danke, dass du so eine vollständige Antwort geschrieben hast (und mit so schönen Bildern)! – pkaeding

0

Das Element "any" existiert, um bei solchen Problemen zu helfen. Ein schönes Beispiel dafür ist here.

+2

Muss ich das nicht zum ursprünglichen Schema hinzufügen? Ich kann das ursprüngliche Schema nicht ändern (wenn ich könnte, würde ich es wahrscheinlich nicht erweitern müssen). – pkaeding

+0

Im Wesentlichen erstellen Sie ein neues Schema, das das Original erweitert, da Sie es nicht ändern können. –