Ett dataprogram består i praktiken av tre saker:
- Sekvenser - saker som görs i tur och ordning.
- Iterationer - saker som upprepas
- Selektioner - val i programmet.
Vi har redan sett sekvenser. HTML koden i XSL filen kan betraktas som sekvens.
I det första exemplet radades dessutom upp ett antal värden. Iterationer
(loopar) såg vi i föregående kapitel. Kvar blir då bara
selektioner (och allt annat ;-)
Motvarigheten till If
xml18_1.xsl
<?xml version='1.0' encoding="iso-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head>
<title>TITEL</title>
<style type="text/css">
h4
{
font-family:verdana,arial,sans-serif;
color:#666666;
}
</style>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<h4>En TestSida</h4>
<xsl:for-each select="products/product">
<!-- nytt -->
<xsl:if test=".[code='Min dator']">
<b>Min: </b>
<hr />
</xsl:if>
<!-- slut på nytt -->
<xsl:value-of select="code"/> <br />
<xsl:value-of select="price"/> <br />
<xsl:value-of select="amount"/> <br />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
Öppna XML filen Öppna XML konverterad till HTML (Även NS)
Hmm... <xsl:if... och </xsl:if... kan man lätt acceptera,
men test=".[code='Min dator']" kan vara lite svårare
att svälja. Det är fullt möjligt att skriva <xsl:if code='Min
dator'>, men resultatet blir inte alls det du tror...
Däremot fungerar dessa varianter likadant (i detta fall):
- <xsl:if test=".[code='Min dator']">
- <xsl:if test="code[.='Min dator']">
- <xsl:if match=".[code='Min dator']">
Punkten förvirrar er säkert (och troligen en hel del annat också)
Programmeringslogiken i XSL
Logiken i XSL är inte baserad på den normala booleska logiken som
finns i t.ex. VB. I VB gör vi jämförelser och kombinerar
dessa med varandra för att få våra if sater att fungera. I
XSL används patterns (Jag orkar inte slå upp det svenska ordet.
Data sker på engelska)
De som arbetat med Linux, mer avancerad HTML eller DOS känner igen punkten
i ovanstående is exempel. Den betecknar nuvarande nod. Man måste
ange pattern eller sätta en punkt ( . )
Detta betyder att .[code='Min dator'] skall tolkas som nuvarande nod
(products/product - punkten) och sedan den nod där code nodens data
är Min Dator.
Ett exempel:
I VB skulle du skriva någonting i stil med:
For I = 0 to 100
If I = 30 Then
doSomething
End If
Next
och logiken blir ungefär
räkna upp variabeln I från 0 till 100
om variabeln I:s värde är lika med
30 så
gör vi något
slut på "om:et"
nästa varv
I XSL skriver vi istället
<xsl:for-each select="products/product">
<xsl:if test=".[code='Min dator']">
do something
</xsl:if>
</xsl:for-each>
Logiken är har ungefär:
upprepa för varje nod som matchar pattern product/products
d.v.s. en products nod som har en undernod med namnet product
om nuvarande not matchar den nod som kan beskrivas
med pattern code='Min Dator' så
gör vi något
slut på "om:et"
nästa varv
Nu kanske du tycker att detta är hårklyveri över svenska språkets
betydelse, men de två ovanstående exempelkodernas betydelse är
inte samma. Fundera en stund på vilka skillnader det finns i beskrivningarna!
Det är således egentligen inte fråga om en logisk jämförelse,
utan om en jämförelse mellan patterns.
Vi kommer oss således inte längre om vi inte kan patterns....
... och det handlar nästa kapitel om.