Announcement

Collapse
No announcement yet.

Traversierung d. Quellbaumes

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Traversierung d. Quellbaumes

    Hallo,

    ich habe folgende .xsl Datei:
    Code:
    ...
    <xsl:template match="eintrag">
    <b> <xsl:value-of select="vorname"/> </b> 
    <xsl:apply-templates/>
    </xsl:template> 
    
    <xsl:template match="telefon">
    tel.:<xsl:value-of select="festnetz"/>
    </xsl:template>
    ...

    und die dazugehörige .xml Datei:
    Code:
    <adressbuch>
    	<eintrag>
    		<vorname>Hans</vorname>
    		<nachname>Wurst</nachname>
    		<adresse>
    			<strasse>Musterstrasse</strasse>
    			<hausnr>1</hausnr>
    			<plz>01234</plz>
    			<ort>Musterstadt</ort>
    		</adresse>
    		<telefon>
    			<festnetz>1234</festnetz>
    			<mobil>5678</mobil>
    		</telefon>
    	</eintrag>
    	<eintrag>
    		<vorname>Georg</vorname>
    		<nachname>Müller</nachname>
    		<adresse>
    			<strasse>Friedenstrasse</strasse>
    			<hausnr>3</hausnr>
    			<plz>04567</plz>
    			<ort>München</ort>
    		</adresse>
    		<telefon>
    			<festnetz>988776</festnetz>
    			<mobil>982363</mobil>
    			<eintrag>muhu</eintrag>
    		</telefon>
    	</eintrag>
    </adressbuch>
    Wenn ich aber z.B. im Firefox mir die Ausgabe anzeigen lasse, kommt:

    HansGeorg Georg Müller Friedenstrasse 3 usw...

    Müsste aber nicht erst der erste Elementknoten Eintrag (Hans) und dessen "Kinder" (mit den Standardtemplates) abgearbeitet werden? D.h. warum werden nur die Kinder des zweiten eintrages (Georg) noch mit ausgegeben und nicht die des ersten?

    Ich dachte der XSL Prozessor arbeitet sich von oben nach unten und von links nach rechts durch den Dokumentbaum. D.h. er bearbeitet erst "Hans" dann dessen Kinder, dann Georg, dann dessen Kinder. Liegt sicher ein Denkfehler vor. Kann mir jemand Schritt für Schritt erklären wie sich der XSLT Prozessor durch den Quellbaum durcharbeitet?

  • #2
    Sofern keine Templates explizit angefordert werden, kommen die Standardtemplates zum Einsatz. Sofern vor den beiden genannten Templates dieses steht:

    Code:
    <xsl:template match="adressbuch">  
      <xsl:apply-templates select="eintrag"/>  
    </xsl:template>
    erhalte ich mit Saxon die Ausgabe:
    <b>Hans</b> Hans Wurst Musterstrasse 1 01234 Musterstadt tel.:1234 <b>Georg</b> Georg Müller Friedenstrasse 3 04567 München tel.:988776

    Praktikabel wäre z. B. dieser Ansatz:

    Code:
    <xsl:template match="adressbuch">  
      <html><head><title>Test</title></head><body>
        <xsl:apply-templates select="eintrag"/>
      </body></html>
    </xsl:template>
      
    <xsl:template match="eintrag">
      <p>
        <xsl:value-of select="vorname"/><xsl:text> </xsl:text><xsl:value-of select="nachname"/><br />
        <xsl:apply-templates select="adresse"/>
      </p>
    </xsl:template> 
    
    <xsl:template match="adresse">
      <xsl:value-of select="strasse"/><xsl:text> </xsl:text><xsl:value-of select="hausnr"/><br />
      <xsl:value-of select="plz"/><xsl:text> </xsl:text><xsl:value-of select="ort"/><br />
      <xsl:apply-templates select="../telefon"/>
    </xsl:template>
    
    <xsl:template match="telefon">
      <xsl:value-of select="festnetz"/><xsl:text> | </xsl:text><xsl:value-of select="mobil"/>
    </xsl:template>
    Ergebnis:
    Code:
    <html>
       <head>
          <title>Test</title>
       </head>
       <body>
          <p>Hans Wurst<br>Musterstrasse 1<br>01234 Musterstadt<br>1234 | 5678</p>
          <p>Georg Müller<br>Friedenstrasse 3<br>04567 München<br>988776 | 982363</p>
       </body>
    </html>

    Comment


    • #3
      ...

      Danke für die schnelle Antwort. Ja eben, die Standardtemplates müssten angewendet werden, d.h. auch den Inhalt der Kinder des ersten Eintrages ausgeben. Sehr nett, dass du mir eine Lösung präsentierst, jedoch würde ich gerne verstehen warum meine Lösung nicht klappt. D.h. ich würde gerne Schritt für Schritt die Abarbeitung des Baumes von oben nach unten nachvollziehen können. Gibt es ggf. einen XSLT Simulator, der einen (grafischen) Baum durchläuft?

      Comment


      • #4
        Naja, ich habe mit Saxon die erwartete Standard-Ausgabe erhalten. Muss dann wohl an Firefox liegen, wenn es dort anders läuft.

        Comment


        • #5
          Hi,

          danke für die Antwort. Hmm. Schade. Das lässt sich dann wohl nicht herausbekommen :-) Übrigens, wo kann ich mir den Saxon für Windows runterladen? Gibt es irgendwelche Tools die den Aufbau des Zielbaums vom Quellbaum grafisch darstellen?

          Comment


          • #6
            Saxon gibt es wahlweise als Java- oder .NET-Anwendung. Es ist ein Kommandozeilentool, welches auch innerhalb von XML-IDEs wie XMLSpy und Co. verwendet werden kann. Alternativ kann ich AltovaXML empfehlen.

            Comment

            Working...
            X