Thomas Müller: XML-Schema !!!!!!!!!!dringend!!!!!!!!!!

Mein Problem:
Ich habe mittels XML-Schemas unter dem Namespace "../CommonUsed/Types"
einen "complexType" namens "Element" definiert, dieser enthält eine qualifizierte Elementdeklaration "description".
Des weiteren habe ich unter dem Namespace "../Metadata/Types" einen
"complexType" mit dem Namen "Abstract-Stencil" definiert, welcher
"Element" erweitert. Unter dem Namespace "../Metadata" deklariere
ich ein Element("stencil") vom eben diesem Typ("Abstract-Stencil").
Möchte ich nun eine "Instanz" des Namespaces "../Metadata" anlegen,
muss ich für das "description" Element den Namespace
"../CommonUsed/Types" verwenden, was ich aber nicht möchte.
Wenn ich aber die Elementdeklaration für den Typ "Abtstract-Stencil"
in der gleichen Datei halte wie die Definition seiner selbst("Abstract-Stencil"),
so kann ich problemlos das "description" Element unter dem Namespace
im welchem "Abstract-Stencil" definiert und deklariert wurde verwenden.
Ich möchte aber Typdefinition und deren Deklaration weites gehend
voneinander Trennen.
Wie kann ich das Realisieren?

Hier noch ein paar Ausschnitte der wichtigsten Stellen:

<xs:schema targetNamespace="../CommonUsed/Types"
           xmlns:target="../CommonUsed/Types"
           elementFormDefault="qualified">

<xs:complexType name="Element">
  xs:complexContent
   <xs:restriction base="xs:anyType">
    xs:all
     <xs:element name="description"
                 type="xs:string"
                 minOccurs="0"
                 maxOccurs="1"/>
    </xs:all>
   </xs:restriction>
  </xs:complexContent>
 </xs:complexType>
</xs:schema>

<xs:schema targetNamespace="../Metadata/Types"
           xmlns:target="../Metadata/Types"
           xmlns:types="../CommonUsed/Types"
           elementFormDefault="qualified">

<xs:import namespace="../CommonUsed/Types"
            schemaLocation="Pfadangabe zum entsprechenden Schema"/>
 <xs:complexType name="Abstract-Stencil">
  xs:complexContent
   <xs:extensionn base="types:Element">
    xs:sequence
     <xs:element name="stencil"
                 type="target:Abstract-Stencil"
                 minOccurs="0"
                 maxOccurs="unbounded"/>
    </xs:sequence>
   </xs:restriction>
  </xs:complexContent>
 </xs:complexType>
</xs:schema>

<xs:schema targetNamespace="../Metadata"
           xmlns:target="../Metadata"
           xmlns:types="../Metadata/Types"
           elementFormDefault="qualified">

<xs:import namespace="../Metadata/Types"
            schemaLocation="Pfadangabe zum entsprechenden Schema"/>
 <xs:element name="stencil" type="types:Abstract-Stencil"/>
</xs:schema>

<stencil xmlns="../Metadata"
         schemaLocation="../Metadata
                         Pfadangabe zum entsprechenden Schema">
 <decription/><!--
                   Genau hier wird jetzt der
                   entsprechende NS gefordert :-(
               -->
</stencil>

  1. Seid gegruesst!

    Mir deucht, ihr werdet bald feststellen, dass das Fragen von eher komplexen Fragen, die sich auf eine Technik beziehen, die weder besonders verbreitet noch in unserer Lordschaft Meinung in den meisten Faellen von irgendeinem ueberlegenen Nutzen ist, ganz besonder bei Kombination mit erheblich zu vielen Fragezeichen in der Ueberschrift, die leicht als Unhoeflichkeit interpretiert werden koennten, zumal eine Antwort auf eine Frage gefordert wird, welche zu beantworten moeglicherweise einige Zeit des Ueberlegens in Anspruch nehmen koennte, zu allem Ueberfluss auch noch kostenlos, zu keiner sinnvollen Antwort fuehrt.

    Lord Helmchen

    1. Sehr geehrter Lord Helmchen,

      die unhöflichen Fragezeichen (vielleicht aber doch Ausrufezeichen) dienten lediglich der Betonung, welche die Dringlichkeit meiner Frage hervorheben sollte.

      Im meinem Falle ist diese Technik(XML-Schema) mit einer erheblichen Reduzierung des Implementierungsaufwandes verbunden, der mir in meiner Arbeit bevor steht und somit keineswegs fragwürdig.
      Sonst aber ist Ihr Einwand sehr wohl berechtigt, doch sollte man nichts unversucht lassen.

      Thomas

  2. Hallo Jawan,

    Wenn ich aber die Elementdeklaration für den Typ "Abtstract-Stencil"
    in der gleichen Datei halte wie die Definition seiner selbst("Abstract-Stencil"),
    so kann ich problemlos das "description" Element unter dem Namespace
    im welchem "Abstract-Stencil" definiert und deklariert wurde verwenden.

    Den Satz verstehe ich nicht: Du definierst einen complexType namens Abstract-Stencil und deklarierst in dieser Typdefinition dein Element. So zumindest in deinem Beispiel. Also steht Elementdeklaration und Typdefinition in einer Datei. Wie solle es anders sein.

    Ich möchte aber Typdefinition und deren Deklaration weites gehend
    voneinander Trennen.

    In Deinem Beispiel tust Du das aber doch auch nicht, denn sonst müsstest du in deinen Typdefinitionen die an anderer Stelle deklarierten Elemente referenzieren:

    z.B. so:
    <xs:element ref="Abstract-Stencil"/>

    Wie kann ich das Realisieren?

    <stencil xmlns="../Metadata"
             schemaLocation="../Metadata
                             Pfadangabe zum entsprechenden Schema">
    <decription/><!--
                       Genau hier wird jetzt der
                       entsprechende NS gefordert :-(
                   -->
    </stencil>

    Versteh ich richtig, dass er von Dir einen anderen Namespace fordert als den ../Metadata-NS für das description-Element, nämlich den ../CommonUsed/Types". Was ja auch korrekt ist so wie du es definiert hast.
    Wann tut er das denn nicht? Im Grunde die gleiche Frage von oben.

    Warum deklarierst du nicht für dein description-Element in der XML-Datei den richtigen NS?

    Gruß
    Franz

    PS: Sorry, dass ich nur mit Fragen "antworten" kann, aber wenns so dringend ist, wärs ganz gut es erstmal zu verstehen ;-)

    1. Hallo fjh,

      "Den Satz verstehe ich nicht: Du definierst einen complexType namens Abstract-Stencil und deklarierst in dieser Typdefinition dein Element. So zumindest in deinem Beispiel. Also steht Elementdeklaration und Typdefinition in einer Datei. Wie solle es anders sein."

      Das man die Typdeklaration und die Definition nicht komplett voneinander trennen kann ist klar. Mir geht es vielmehr darum, dass ich erst einmal alle benötigten Typen definiere und dann in einem weiteren Schema die Struktur des entsprechenden Instanz-Dokumentes beschreibe. D.h. ich möchte auf der einen Seite ein Schema welches in seiner Funktionalität einer Typbibliothek ähnelt ("../Metadata/Types" und "../CommonUsed/Types") und somit auch nur lokale Elementdeklarationen enthält und auf der anderen Seite ein Schema welches das Dokumentenelement deklariert und mittels anonymer Typdefinition in seiner Struktur beschreibt.

      "Versteh ich richtig, dass er von Dir einen anderen Namespace fordert als den ../Metadata-NS für das description-Element, nämlich den ../CommonUsed/Types". Was ja auch korrekt ist so wie du es definiert hast.
      Wann tut er das denn nicht?"

      Wenn ich aber die Namespaces "../Metadata/Types" und "../Metadata" zusammenfasse (was ich nicht möchte), kann ich für das "description" Element den Namespace verwenden der aus der Zusammenfassung resultiert (wie man ihn auch immer nennen möchte).

      Wenn ich die "REC-xmlschema-0-200110501" richtig verstanden habe, ist es nach Kapitel 5.4 "Importing Types" möglich, komplexe Typen aus fremden Namespaces zu importieren und aus ihnen neue Typen abzuleiten (sei es über eine "restriction" oder eine "extension") welche alle lokalen Elementdeklarationen des zu erweiternden Typs in den neuen Namespace überführen.

      Gruß Jawan

      1. Hallo,

        Wenn ich die "REC-xmlschema-0-200110501" richtig verstanden habe, ist es nach Kapitel 5.4 "Importing Types" möglich, komplexe Typen aus fremden Namespaces zu importieren und aus ihnen neue Typen abzuleiten (sei es über eine "restriction" oder eine "extension") welche alle lokalen Elementdeklarationen des zu erweiternden Typs in den neuen Namespace überführen.

        Ja, aber dein Wurzelelement stencil deklarierst Du doch in einem eigenen Target-NS. Dein description-Element deklarierst du im namespace: ../Common/Types und über die Erweiterung in der Typdefinition Abstract-Stencil erhält es den NS ../Metadata/Types.

        Eine Lösung kenne ich nicht, aber mir ist auch der Sinn der Aktion nicht ganz klar. Wozu diese ganzan NS-Bevölkerungen, wenn Du Sie in deinem Instanz-Dokument dann wieder verschmelzen willst. xs:import dient doch gerade dazu Validierung für Instanzdokumente die mehrere NS enthalten zu ermöglichen. Wenn du nur einen haben willst kannst du auch xs:include benutzen...

        Wenn du ne Lösung hast poste Sie mal, vielleicht versteh ich ja dann denn Sinn bzw. das Problem richtig.

        Gruß
        Franz

  3. Selber hallo,

    Mein Problem:

    Dein Problem: Du weißt noch nicht, daß in diesem Forum ein String von mehr als zwei Ausrufezeichen immer mit einer 1 endet.

    Ungefähr so:

    "XML-Schema !!!!!!!!!1 dringend!!!!!!!!!1"

    Herzliche Grüße,
    Meg

    1. Dein Problem: Du weißt noch nicht, daß in diesem Forum ein String von mehr als zwei Ausrufezeichen immer mit einer 1 endet.

      Ungefähr so:

      "XML-Schema !!!!!!!!!1 dringend!!!!!!!!!1"

      Hi Meg,

      ist das jetzt ein Verbesserungsvorschlag? :)~

      Dieses Feature könnte man doch sicherlich ganz einfach einbauen, jeweils das letzte Vorkommen eines sich wiederholenden Ausrufezeichens dúrch eine Eins zu ersetzen (ich wünschte ich verstünde reguläre Ausdrücke gut genug um den entsprechenden hier zu posten, habs aber nicht hingekriegt, die verflixten Dinger werden mir ewig ein Rätsel bleiben!)

      Bye
      Wolfgang

      1. Hallo Wolfgang,

        jeweils das letzte Vorkommen eines sich wiederholenden Ausrufezeichens dúrch eine Eins zu ersetzen (ich wünschte ich verstünde reguläre Ausdrücke gut genug um den entsprechenden hier zu posten, habs aber nicht hingekriegt, die verflixten Dinger werden mir ewig ein Rätsel bleiben!)

        Kann ich auch nicht - keine blasse Ahnung. Ich mach das immer von Hand: Mit dem rechten kleinen Finger auf die Shift-Taste drücken und halten, dann mit dem linken kleinen Finger auf die 1/!-Taste drücken und ebenfalls eine Weile halten, zum Schluß - hier wird's etwas kniffelig - mit dem rechten kleinen Finger ganz leicht von der Shift-Taste abrutschen und fast sofort (!) danach die 1/!-Taste ebenfalls loslassen... Also ungefähr so:

        !!!!!!!!!!!!!!!!!!!!!!!!11 *huchjetztsindszweigeworden*

        Naja, ich denke, wenn ich noch ein bißchen übe, dann werd ich bald genauso gut wie die allergrößten Schrei-Profis hier...

        Versuchs mal -- aber tu Dir nicht weh... ;o)

        Herzliche Grüße,
        Meg