Announcement

Collapse
No announcement yet.

Ausgabe von XML Daten ohne for-each Schleife

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

  • Ausgabe von XML Daten ohne for-each Schleife

    Hi Leute,

    im Rahmen einer Hausübung soll eine XML Datei erstellt werden die mit Hilfe eines XSLT Stylesheets in eine HTML Datei transformiert und anschliessend angezeigt werden soll.

    Das wäre alles kein Problem, gäbe es da nicht die Vorgabe, dass die "for-each" Schleife nicht verwendet werden darf.

    Da ich selber zum ersten mal mit XML + XSLT arbeite und noch sehr wenig Erfahrung auf diesem Gebiet habe bräuchte ich etwas Hilfestellung beim Finden eines Workarounds.

    Ein weiteres Problem ist die sortierte Ausgabe der Daten, was mit "for-each" recht einfach ist - aber wie geht es ohne.

    So sieht meine XML Datei aus:

    Code:
    <liste>
    	<kind name="Albert" geb="19.01.1944" brav="ja">
    		<adresse>
    			<strasse>Strasse 4</strasse>
    			<plz>55555</plz>
    			<ort>Nirgendwo</ort>
    		</adresse>
    		<wunschliste>
    			<wunsch bote="weihnachtsmann">
    				<bezeichnung>Objektiv</bezeichnung>
    				<beschreibung>Nikon Af-S DX 18 - 200 VR</beschreibung>
    				<groesse>20x30 cm</groesse>
    				<gewicht>1,2 kg</gewicht>
    			</wunsch>
    		</wunschliste>
    	</kind>
    
            <kind name="Franz" geb="15.02.66" brav="ja">
    		<adresse>
    			<strasse>Strasse 2</strasse>
    			<plz>33444</plz>
    			<ort>Wüste</ort>
    		</adresse>
    		<wunschliste>
    			<wunsch bote="Nikolaus">
    				<bezeichnung>Objektiv</bezeichnung>
    				<beschreibung>Nikon Af-S DX 18 - 200 VR</beschreibung>
    				<groesse>20x30 cm</groesse>
    				<gewicht>1,2 kg</gewicht>
    			</wunsch>
    		</wunschliste>
    	</kind>
    </liste>
    Leider konnte ich keinen Beitrag finden der mir in irgendeiner Weise weiterhelfen konnte.

    Vielen Dank im voraus!

    Gruß

    Chritstoph

  • #2
    Es gibt hier genügend Beiträge zum Thema xsl:for-each vs. xsl:apply-templates, denn darauf läuft es hinaus (übrigens dickes Doppelplus für Deinen Lehrer, Vermeidung von xsl:for-each macht oft Sinn).

    Ansatz:
    Code:
    <xsl:template match="liste">
      <xsl:apply-templates select="kind">
        <xsl:sort select="@name" data-type="text" order="ascending"/>    
      </xsl:apply-templates>  
    </xsl:template>
      
    <xsl:template match="kind">
      <p><xsl:value-of select="@name"/> : <xsl:value-of select="wunschliste/wunsch/bezeichnung"/></p>
    </xsl:template>
    Ausgabe:
    Code:
    <p>Albert : Objektiv</p>
    <p>Franz : Objektiv</p>
    Hinweis: Die Hierarchie wunschliste/wunsch/bezeichnung könnte man analog weiter in Templates aufsplitten, sollte hier aber reichen.

    Comment


    • #3
      Hallo Thomas,

      vielen Dank für deine rasche Antwort!

      Ich habe deinen Code bei mir eingefügt, aber leider die erwartete Ausgabe nicht erhalten.

      Meine XSL-Datei sieht nun wie folgt aus:

      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      
      <!--
          Document   : stylesheet.xsl
          Created on : 9. Januar 2010, 22:11
          Author     : ccc
          Description:
              Purpose of transformation follows.
      -->
      
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
          <xsl:output method="html"/>
      
          <!-- TODO customize transformation rules 
               syntax recommendation http://www.w3.org/TR/xslt 
          -->
          <xsl:template match="/">
              <html>
                  <head>
                      <title>Geschenke</title>
                      <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
                  </head>
                  <body>
                      <xsl:template match="liste">
                          <xsl:apply-templates select="liste/kind">
                              <xsl:sort select="liste/kind/@name" data-type="text" order="ascending"/>
                          </xsl:apply-templates>
                      </xsl:template>
      
                      <xsl:template match="liste/kind">
                          <p>
                              <xsl:value-of select="liste/kind/@name"/> :
                              <xsl:value-of select="liste/kind/wunschliste/wunsch/bezeichnung"/>
                          </p>
                      </xsl:template>
                  </body>
              </html>
          </xsl:template>
      
      </xsl:stylesheet>

      als Ausgabe erhalte ich:

      Code:
      Strasse 4 55555 Nirgendwo Objektiv Nikon Af-S DX 18 - 200 VR 20x30 cm 1,2 kg Strasse 2 33444 Wüste Objektiv Nikon Af-S DX 18 - 200 VR 20x30 cm 1,2 kg
      
      Albert : Objektiv
      Vielleicht habe ich irgendwo in der XSL-Datei noch einen Fehler, den ich nicht finden kann.

      Für weitere Hilfe wäre ich sehr dankbar!

      Gruß

      Christoph

      Comment


      • #4
        <xsl:template match="liste">
        <xsl:apply-templates select="liste/kind">
        ...?

        Hat liste ein weiteres Kindelement liste?

        Comment


        • #5
          Nein, aber wenn ich es so schreibe:

          <xsl:template match="liste">
          <xsl:apply-templates select="kind">
          .....

          bekomme ich keine Ausgabe!

          Ich habe mich auch schon gewundert!

          Comment


          • #6
            xsl:template kann nicht in einem anderen xsl:template stehen.

            Comment


            • #7
              Habe den Code der XSLT-Datei verändert, so wie von dir vorgeschlagen:

              Code:
              Code:
              <?xml version="1.0" encoding="UTF-8"?>
              
              <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                  <xsl:output method="html"/>
                  <html>
                      <head>
                          <title>Geschenke</title>
                          <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
                      </head>
                      <body>
                          <xsl:template match="liste">
                              <xsl:apply-templates select="kind">
                                  <xsl:sort select="@name" data-type="text" order="ascending"/>
                              </xsl:apply-templates>
                          </xsl:template>
                          <xsl:template match="kind">
                              <p>
                                  <xsl:value-of select="@name"/> :
                                  <xsl:value-of select="bezeichnung"/>
                              </p>
                          </xsl:template>
                      </body>
                  </html>
              </xsl:stylesheet>

              bekomme nun folgende Ausgabe:

              Code:
              Strasse 4 55555 Nirgendwo Objektiv Nikon Af-S DX 18 - 200 VR 20x30 cm 1,2 kg Strasse 2 33444 Wüste Objektiv Nikon Af-S DX 18 - 200 VR 20x30 cm 1,2 kg

              Normalerweise sollte als Ausgabe, der Name + gewünschter Artikel erscheinen.

              Verstehe nicht wo der Fehler liegt - weis jemand Rat?

              Comment


              • #8
                <?xml version="1.0" encoding="UTF-8"?>

                <!--
                Document : stylesheet2.xsl
                Created on : 10. Januar 2010, 20:47
                Author : c.eichert
                Description:
                Purpose of transformation follows.
                -->

                <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                <xslutput method="html"/>

                <!-- TODO customize transformation rules
                syntax recommendation http://www.w3.org/TR/xslt
                -->
                <xsl:template match="/">
                <html>
                <head>
                <title>stylesheet2.xsl</title>
                </head>
                <body>
                <table id="ausgabe2" border="1">
                <tr>
                <th>Name</th>
                <th>Strasse</th>
                <th>PLZ</th>
                <th>Ort</th>
                </tr>

                <xsl:apply-templates/>

                </table>

                </body>

                </html>


                </xsl:template>
                <xsl:template match="liste">
                <xsl:apply-templates select="kind">
                <xsl:sort select="@name" data-type="text" order="ascending"/>
                </xsl:apply-templates>
                </xsl:template>

                <xsl:template match="kind">
                <td>
                <xsl:value-of select="@name"/>
                </td>
                <td>
                <xsl:value-of select="adresse/strasse"/>
                </td>
                <td>
                <xsl:value-of select="adresse/plz"/>
                </td>
                <td>
                <xsl:value-of select="adresse/ort"/>
                </td>
                </xsl:template>
                </xsl:stylesheet>
                Zuletzt editiert von lockebello; 10.01.2010, 22:39.

                Comment


                • #9
                  ohne worte

                  sich langsam hoch dienen
                  mit mit der root anfangen /
                  dann einstieg in die xml datei
                  in jeden apply-templates kann ein sort eingesezt werden


                  um struckturiert arbeiten zu können css mit benutzen



                  Code:
                  <?xml version="1.0" encoding="UTF-8"?>
                  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                      <xsl:output indent="yes" method="html"/>
                      <xsl:template match="/">
                          <html>
                              <style type="text/css">
                                  table, th, td
                                  {
                                  border: 1px solid black;
                                  font-family: arial;
                                  font-size:14px;
                                  }
                                  th
                                  {
                                  font-family: arial;
                                  font-size:14px;
                                  color:#ff0000
                                  }
                                  td
                                  {
                                 
                                  font-family: arial;
                                  font-size:10px;
                                  }
                                  .odd
                                  {
                                  color:#ff00ff
                                  }
                                  .even
                                  {
                                  color:#00ff00
                                  }
                                  
                              </style>
                  
                              <body>
                                  <xsl:apply-templates select="liste"/>
                              </body>
                          </html>
                  
                      </xsl:template>
                      <xsl:template match="liste">
                          <table>
                              <tr>
                                  <th>Name</th>
                                  <th>Wunsch</th>
                                  <th>Strasse</th>
                                  <th>PLZ</th>
                                  <th>Ort</th>
                              </tr>
                              <xsl:apply-templates select="kind">
                                  <xsl:sort select="@name" data-type="text" case-order="upper-first"/>
                              </xsl:apply-templates>
                          </table>
                      </xsl:template>
                      <xsl:template match="kind">
                          <tr>
                              <xsl:choose>
                                  <xsl:when test="position() mod 2 =1">
                                      <xsl:attribute name="class">odd</xsl:attribute>
                                  </xsl:when>
                                  <xsl:otherwise>
                                      <xsl:attribute name="class">even</xsl:attribute>
                                  </xsl:otherwise>
                              </xsl:choose>
                              <td>
                                  <xsl:value-of select="@name"/>
                              </td>
                              <td>
                                  <xsl:apply-templates select="wunschliste"/>
                              </td>
                  
                              <xsl:apply-templates select="adresse"/>
                          </tr>
                      </xsl:template>
                      <xsl:template match="adresse">
                          <td>
                              <xsl:value-of select="strasse"/>
                          </td>
                          <td>
                              <xsl:value-of select="plz"/>
                          </td>
                          <td>
                              <xsl:value-of select="ort"/>
                          </td>
                  
                      </xsl:template>
                      <xsl:template match="wunschliste">
                          <xsl:apply-templates select="wunsch"/>
                      </xsl:template>
                      <xsl:template match="wunsch">
                          <xsl:value-of select="concat(bezeichnung,'  ',beschreibung,'  ',groesse,'  ',gewicht)"/>
                      </xsl:template>
                  
                  </xsl:stylesheet>

                  Comment

                  Working...
                  X