verenice: XML-Schema

Hallo,
wenn ich ein Element im XML-File auf sich selbst referenzieren möchte, wie kann ich das im XML-Schema umsetzen?

Ich möchte gern so etwas machen können:
XML:
<Kapitel> XPath
<Kapitel> XPath Navigation </Kapitel>
<Kapitel> XPath Funktionen </Kapitel>
</Kapitel>
<Kapitel>XSLT</Kapitel>

so dass dann folgendes in HTML ausgegeben werden kann:
1. XPath
1.1 XPath Navigation
1.2 XPath Funktionen
2. XSLT

Danke schon mal im voraus.
Schönes WE.

Viele Grüße
verenice

  1. Hallo,

    Ich möchte gern so etwas machen können:
    XML:
    <Kapitel> XPath
    <Kapitel> XPath Navigation </Kapitel>
    <Kapitel> XPath Funktionen </Kapitel>
    </Kapitel>
    <Kapitel>XSLT</Kapitel>

    Ich finde nicht, dass Du Energie mit solchen Strukturen verschwenden solltest, die spaetestens bei der Verarbeitung Probleme machen (Stichwort mixed content).

    Denke eher in diese Richtung einer formalen Dokumentenstruktur (muesste natuerlich noch weiter durchdacht werden):

      
    <?xml version="1.0" encoding="ISO-8859-1"?>  
    <Dokument>  
      <Kapitel>  
        <Ueberschrift>XPath</Ueberschrift>  
        <Vorspann>optionale Kapiteleinführung ...</Vorspann>  
        <Abschnitt>  
          <Ueberschrift>XPath Navigation</Ueberschrift>  
          <Inhalt>  
            <Absatz>...</Absatz>  
            <Absatz>...</Absatz>  
            <Absatz>...</Absatz>  
          </Inhalt>  
        </Abschnitt>  
        <Abschnitt>  
          <Ueberschrift>XPath Funktionen</Ueberschrift>  
          <Inhalt>  
            <Absatz>...</Absatz>  
            <Absatz>...</Absatz>  
            <Absatz>...</Absatz>  
          </Inhalt>  
        </Abschnitt>  
        <!-- weitere Abschnitt-Elemente -->  
      </Kapitel>  
      <Kapitel>  
        <Ueberschrift>XSLT</Ueberschrift>  
        <Vorspann>optionale Kapiteleinführung ...</Vorspann>  
        <Abschnitt>  
          <Ueberschrift>...</Ueberschrift>  
          <Inhalt>  
            <Absatz>...</Absatz>  
            <Absatz>...</Absatz>  
            <Absatz>...</Absatz>  
          </Inhalt>  
        </Abschnitt>  
        <!-- weitere Abschnitt-Elemente -->  
      </Kapitel>  
      <!-- weitere Kapitel-Elemente -->  
    </Dokument>
    

    so dass dann folgendes in HTML ausgegeben werden kann:

    1. XPath
      1.1 XPath Navigation
      1.2 XPath Funktionen
    2. XSLT

    Eine solche Gliederung laesst sich aus der genannten Struktur ebenfalls ableiten (Nummerierung mit xsl:number).

    MfG, Thomas

    1. Hallo Thomas J. S., hallo Thomas Meinike,
      vielen vielen Dank für Eure schnelle Hilfe. :o)

      Viele Grüße
      verenice

  2. Hallo,

    wenn ich ein Element im XML-File auf sich selbst referenzieren möchte, wie kann ich das im XML-Schema umsetzen?

    Ich möchte gern so etwas machen können:
    XML:
    <Kapitel> XPath
    <Kapitel> XPath Navigation </Kapitel>
    <Kapitel> XPath Funktionen </Kapitel>
    </Kapitel>
    <Kapitel>XSLT</Kapitel>

    Zusätzlich was Thomas gesagt hat - wobei ich seine Meinung was "solche Strukturen" angeht insofern nicht teile, dass man in diesem Fall gar nicht von Struktur sprechen kann - kannst du dein Vorhaben so verwirklichen:
    (kapitel muss dabei als globales Elemente deklariert werden)

    <xsd:element name="kapitel">
     <xsd:complexType mixed="true">
      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
       <xsd:element ref="kapitel" />
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>

    Damit sind dann Sachen wie:
    <kapitel>XPath
     <kapitel>XPath Navigation</kapitel>
     <kapitel>XPath Funktionen
      <kapitel>XPath Patterns</kapitel>
     </kapitel>
    </kapitel>
    <kapitel>XSLT</kapitel>

    möglich.

    so dass dann folgendes in HTML ausgegeben werden kann:

    1. XPath
      1.1 XPath Navigation
      1.2 XPath Funktionen
    2. XSLT

    Da wirst du dann paar Probleme haben und den Entwickler des XMLs zum Teufel wünschen. Sowas wie ein:
    <xsl:template match="kapitel">
      <xsl:number level="multiple" format="1.1.1."/>&#160;<xsl:value-of select="current()/text()"/>
      <br />
      <xsl:apply-templates select="kapitel" />
     </xsl:template>
    ist leicht, aber wenn du dann mehrere Texte hat und nicht alles nur der Titel ist hast du schon das erste Problem.

    Grüße
    Thomas

    1. Hallo,

      Zusätzlich was Thomas gesagt hat - wobei ich seine Meinung was "solche Strukturen" angeht insofern nicht teile, dass man in diesem Fall gar nicht von Struktur sprechen kann ...

      Naja "solche Konstrukte" waere vielleicht angebrachter gewesen ;-).

      MfG, Thomas

  3. Hallo,

    wenn ich ein Element im XML-File auf sich selbst referenzieren möchte, wie kann ich das im XML-Schema umsetzen?

    Ich möchte gern so etwas machen können:
    XML:
    <Kapitel> XPath
    <Kapitel> XPath Navigation </Kapitel>
    <Kapitel> XPath Funktionen </Kapitel>
    </Kapitel>
    <Kapitel>XSLT</Kapitel>

    Wie bereits geschrieben, waere das nicht mein Ansatz, aber um auch die Frage zum moeglichen XSL-Schema zu beantworten (mixed content kann ja durchaus mal sinnvoll sein):

      
    <xs:element name="Kapitel" minOccurs="0" maxOccurs="unbounded">  
      <xs:complexType mixed="true">  
        <xs:sequence>  
          <xs:element name="Kapitel" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>  
        </xs:sequence>  
      </xs:complexType>  
    </xs:element>
    

    Ich bin hier jeweils von 0...n Kapitel-Elementen ausgegangen.

    MfG, Thomas

    1. Hallo Thomas,

      <xs:element name="Kapitel" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType mixed="true">
          xs:sequence
            <xs:element name="Kapitel" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

      
      >   
        
      Haltest du es für günstig, zwei Elemente mit demselben Namen aber mit unterschiedlichen Inhaltstypen zu definieren? Wobei eine weitere Ebene der Verschachtelung nicht möglich ist. (das äußere Kapitel in deinem Bsp. darf auch nur innerhalb einer Struktur und nicht als globales Elementen definiert werden.[nur als Anmerkung])  
        
      Grüße  
      Thomas  
        
        
      
      
      1. Hallo,

        Haltest du es für günstig, zwei Elemente mit demselben Namen aber mit unterschiedlichen Inhaltstypen zu definieren? Wobei eine weitere Ebene der Verschachtelung nicht möglich ist. (das äußere Kapitel in deinem Bsp. darf auch nur innerhalb einer Struktur und nicht als globales Elementen definiert werden.[nur als Anmerkung])

        Optimal ist das eher nicht, hat aber prinzipiell zur Beschreibung des genannten Codestueckes gepasst.

        Ich bin davon ausgegangen, dass Kapitel nicht gleichzeitig das Wurzelelement ist, was mit Deinem Code (ref="Kapitel") unterhalb von

        <xs:element name="Wurzel">
            xs:complexType
              xs:sequence
        ...

        nicht unmittelbar gelingt.

        MfG, Thomas

      2. Hallo,

        Haltest du es für günstig, zwei Elemente mit demselben Namen aber mit unterschiedlichen Inhaltstypen zu definieren?

        Ich wollte zur Beschreibung von

          
        <?xml version="1.0" encoding="ISO-8859-1"?>  
        <Wurzel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">  
          <Kapitel>XPath  
            <Kapitel>XPath Navigation</Kapitel>  
            <Kapitel> XPath Funktionen</Kapitel>  
          </Kapitel>  
          <Kapitel>XSLT</Kapitel>  
        </Wurzel>
        

        eigentlich darauf hinaus (test.xsd):

          
        <?xml version="1.0" encoding="ISO-8859-1"?>  
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  
          <xs:element name="Wurzel">  
            <xs:complexType>  
              <xs:sequence>  
                <xs:element ref="Kapitel" minOccurs="0" maxOccurs="unbounded"/>  
              </xs:sequence>  
            </xs:complexType>  
          </xs:element>  
          <xs:element name="Kapitel">  
            <xs:complexType mixed="true">  
              <xs:sequence minOccurs="0" maxOccurs="unbounded">  
                <xs:element ref="Kapitel"/>  
              </xs:sequence>  
            </xs:complexType>  
          </xs:element>  
        </xs:schema>
        

        MfG, Thomas

        1. Hallo Thomas,

          Haltest du es für günstig, zwei Elemente mit demselben Namen aber mit unterschiedlichen Inhaltstypen zu definieren?

          eigentlich darauf hinaus (test.xsd):

          <?xml version="1.0" encoding="ISO-8859-1"?>
          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:element name="Wurzel">
              xs:complexType
                xs:sequence
                  <xs:element ref="Kapitel" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Kapitel">
              <xs:complexType mixed="true">
                <xs:sequence minOccurs="0" maxOccurs="unbounded">
                  <xs:element ref="Kapitel"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:schema>

            
          \*lol\*  
          mein "test.xsd" dazu schaut(e) so aus:  
            
          ~~~xml
            
          <?xml version="1.0" encoding="UTF-8"?>  
          <xsd:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
          <xsd:element name="data">  
           <xsd:complexType>  
            <xsd:sequence maxOccurs="unbounded">  
             <xsd:element ref="kapitel" />  
            </xsd:sequence>  
           </xsd:complexType>  
          </xsd:element>  
          <xsd:element name="kapitel">  
           <xsd:complexType mixed="true">  
            <xsd:sequence minOccurs="0" maxOccurs="unbounded">  
             <xsd:element ref="kapitel" />  
            </xsd:sequence>  
           </xsd:complexType>  
          </xsd:element>  
          </xsd:schema>  
          
          

          Grüße
          Thomas

          1. Hallo Thomas J. S., hallo Thomas Meinike,
            vielen vielen Dank für Eure schnelle Hilfe. :o)

            Viele Grüße
            verenice