2017-08-22 2 views
0

Ich habe eine Haupt-xsd-Datei mit dem XML-Schema definiert und die zweite, die Erweiterungen enthält. Ich brauche etwas wie folgt:Namespaces in XML, wenn zwei Schemas verwendet werden

<ns:Node> 
    <InnerNode> 
     <Value1>value 1</Value1> 
     <Value2>value 2</Value2> 
    </InnerNode> 
</ns:Node> 

Die InnerNode-Definition ist in der Hauptdatei, der Knoten in der Erweiterung eins. Meine Erweiterungsdefinition sieht wie folgt aus:

Die Namespaces sind in beiden Schemas definiert, ich habe Importe für beide. Wenn ich das Schema mit Beispiel-XML validiere, bekomme ich den Fehler, dass auch der InnerNode den Namespace haben sollte, nicht nur das Node-Element. Ich habe versucht, das form-Attribut mit dem nicht qualifizierten Wert zu verwenden, aber es hat nicht geholfen - der Validator (XMLSpy) schlägt vor, das leere xmlns-Attribut einzufügen.

Ist es möglich, das InnerNode-Element zu definieren, das den Namespace nicht benötigt (einige fehlende Attribute)?

EDIT: ich, dass in der Haupt XSD-Datei nicht erwähnt habe ich den Knotentyp als Teil der größeren Struktur verwenden (dass es wahrscheinlich etwas komplizierter macht es):

<OuterNode> <!-- defined in main xsd --> 
    <ns:Node> <!-- defined in imported --> 
     <InnerNode> <!-- defined in main --> 
      <Value1>value 1</Value1> 
      <Value2>value 2</Value2> 
     </InnerNode> 
    </ns:Node>  
</OuterNode> 

Ist es Möglich, es so zu machen?

+0

Ein wenig Technisierung: Sie haben tatsächlich ein Schema aus zwei Schemadokumente gemacht. Aber keine Sorge, das wissen nicht viele. –

Antwort

0

Ich habe einige der Forschung durchgeführt und erhielt folgendes Ergebnis:

Wenn Sie in Ihrem Haupt-Schema ElementFormDefault- = „unqualifizierte“ und zugleich hinzufügen Sie form = „unqualifizierte“ in die Definition des Begriffs der hinzufügen Element InnerNode im Erweiterungsschema

wird es funktionieren und validieren richtig.

Ich habe beigefügte Beispiele der Schemata unten:

main.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.main.org" targetNamespace="http://www.main.org" elementFormDefault="unqualified"> 
    <xsd:complexType name="InnerNodeType"> 
    <xsd:sequence> 
     <xsd:element name="Value1" type="xsd:string"/> 
     <xsd:element name="Value2" type="xsd:string"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

additional.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.additional.org" targetNamespace="http://www.additional.org" 
      xmlns:ext="http://www.main.org" elementFormDefault="qualified"> 
    <xsd:import schemaLocation="main.xsd" namespace="http://www.main.org"/> 
    <xsd:element name="Node"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="InnerNode" type="ext:InnerNodeType" form="unqualified"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

Danke für die Antwort. Ich habe dies versucht, aber es löst mein Problem nicht - das Attribut xmlns = "" ist erforderlich, um die Validierung zu bestehen. – owczarek

+0

Hoffe ich verstehe das Problem richtig. Aus diesem Grund habe ich zwei einfache xsd erstellt: der Hauptknoten definiert InnerNodeType und der zusätzliche definiert Knotenelement. Ich habe Xml von diesem Xsd. Und es sieht so aus, als hättest du –

+0

erreicht. Ich kann das Attribut xmlns = "" nicht mit dem Attribut form = "unqualified" loswerden. Mein Fall ist komplizierter, ich habe vergessen, die äußere Struktur zu erwähnen. Bitte sehen Sie meine Bearbeitung der Frage. – owczarek

1

Wenn das InnerNode Element in einer Elementdeklaration in einem separaten definiert ist Schemadokument, dann brauchen Sie ref="InnerNode" anstatt name="InnerNode". (Mit name = erstellt eine lokale Elementdeklaration, die beliebigen Inhalt erlaubt).

Alternativ kann, wenn der Typ des InnerNode Element wird in einem separaten Schemadokument definiert sind, dann können Sie name="InnerNode" type="InnerNodeType" verwenden

So oder so, wenn der Ziel-Namensraum des anderen Schemadokument fehlt (dh es ist ein no- Namespace Schemadokument), dann muss der Wert von "type" oder "ref" ein QName ohne Namespace sein. Das bedeutet, dass das enthaltene Element keinen Standardnamespace im Bereich haben darf. Aber Ihr tut: xmlns="http://www.additional.org". So müssen Sie dies mit einem undeclaration abzubrechen:

<xsd:element ref="InnerNode" xmlns=""/> 

oder

<xsd:element name="InnerNode" form="unqualified" type="InnerNodeType" xmlns=""/> 
+0

Vielen Dank für die Wiederholung. Ich habe das versucht, aber ich muss immer noch das xmlns = "" Attribut in der XML haben. Gibt es eine Möglichkeit, dieses Problem zu lösen? – owczarek

+0

Sie brauchen nur 'xmlns =" ​​"' in der XML-Instanz, wenn es ein äußeres Element mit einer Namespace-Deklaration in der Form 'xmlns =" ​​something.else "' gibt. –

+0

Also in meinem Fall muss meine xml aussehen: Wert 1 Wert 2 ? Ist das richtig? – owczarek

Verwandte Themen