DevTrain

Autor: Andreas Rauch

Templates machen keine Freunde

Oft genaug bereiten templates Kopfzerbrechen.Nicht, daß sie für XSL Beginner relativ schwer zu begreifen sind, sondern sie machen dann auch noch ganz merkwürdige Dinge.

Sehen wir uns folgendes Beispiel mal genauer an:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="template.xsl" ?>
<!-- Readings for 2000-11-01 -->
<weather>
 <today>
  <temperature scale="F">76</temperature>
  <temperature scale="F">55</temperature>
  <humidity>67</humidity>
  <wind unit="mph">5</wind>
  <!-- No precipitation today -->
  <precip/>
 </today>
 <forecast day="+1">
  <temperature scale="F">81</temperature>
  <humidity>30</humidity>
  <wind unit="mph">10</wind>
  <precip>Rain</precip>
 </forecast>
 <forecast day="+2">
  <temperature scale="F">72</temperature>
  <humidity>60</humidity>
  <wind unit="mph">2</wind>
  <precip>Fog</precip>
 </forecast>
</weather>


In unserem XSL File wollen wir nur die Wetterwerte der nächsten Tage anzeigen lassen. Dazu verwenden wir folgendes XSL File:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"   
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/TR/REC-html40" >

<xsl:template match="forecast">
    <h2>Forecast for (Today <xsl:value-of select="@day"/>):</h2>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="temperature">
    <p><b>Temperature:
        <xsl:value-of select="."/>&#x0a;<xsl:value-of select="@scale"/>
    </b></p>
</xsl:template>

<xsl:template match="humidity">
    <p><b>Relative humidity:
        <xsl:value-of select="."/>%
    </b></p>
</xsl:template>

</xsl:stylesheet>

UUPPS! Obwohl wir unsere templates sauber gemacht haben, sehen wir trotzdem die Werte der Elemente "precip" und "wind". Es kommt noch besser. Auch die Werte von "today" werden angezeigt.

Wir wollen aber nur die forecasts sehen. Wie sollen wir das anstellen?

Folgendes Beispiel funtkioniert!

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"   
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    xmlns="http://www.w3.org/TR/REC-html40" >

<xsl:template match="/weather/today" />

<xsl:template match="forecast">
    <h2>Forecast for  Today <xsl:value-of select="@day"/></h2>
    <xsl:apply-templates select="temperature|humidity"/>
</xsl:template>

<xsl:template match="temperature">
    <p><b>Temperature:
        <xsl:value-of select="."/>&#x0a;<xsl:value-of select="@scale"/>
    </b></p>
</xsl:template>

<xsl:template match="humidity">
    <p><b>Relative humidity:
        <xsl:value-of select="."/>
    </b></p>
</xsl:template>

</xsl:stylesheet>

Warum? Mit der Anweisung <xsl:template match="/weather/today" /> unterdrücken wir jegliche Ausgaben von temperature und humidity. Zusätzlich verwenden wir ausdrücklich die  templates "humidity" und "temperature" <xsl:apply-templates select="temperature|humidity"/> . Nur durch diesen kleinen Trick bringen wir xsl dazu nur gewünschte Werte auszugeben bzw. nur die angebenen Anweisungen der templates auszuführen.


Erfasst am: 26.07.2001 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=502
© Copyright 2003 ppedv AG - http://www.ppedv.de