XSL: Variabler og parametre

No comments

Sette en variabel basert på kriterier:
 
I vanlige programmeringsspråk ser man ofte lignede uttrykk:
 
if(a) b=2; else b=3;
 
I xsl er variabler konstante. (pun intented)
 
Dvs. har du satt en variabel får du ikke sette den på ny.
(dvs. den kan f.eks være inni et template og bli satt til en ny verdi ved hver gjennomkjøring, men da er variabelen "ny" ved hver gjennomkjøring)
 
For å sette en variabel basert på visse kriterier kunne man se for seg noe sånt som dette:
 
 
    <xsl:choose>
      <xsl:when test="$TypeProdukt='Trygghet'">
        <xsl:variable name="linkerspar">1
        </xsl:variable>
      </xsl:when>
      <xsl:when test="$TypeProdukt= 'Forening'">
        <xsl:variable name="linkerspar">2

        </xsl:variable>
      </xsl:when>
    </xsl:choose>
 
men dette vil bare gi to variable som har scope/levetid kun innenfor sin respektive When-setning.
$linkerspar vil ikke finnes når xsl:choose-setningen er ferdig
 
 
XSL-måten å gjøre det på er motsatt:
 
    <xsl:variable name="linkerspar">
     <xsl:choose>
      <xsl:when test="$TypeProdukt='Trygghet'">
1
      </xsl:when>
      <xsl:when test="$TypeProdukt= 'Forening'">2
      </xsl:when>
     </xsl:choose>
    </xsl:variable>
 
 
 
Sjekke verdi av en variabel:
 
over ser du også hvordan du kan sjekke verdien på variabelen:
 
<xsl:when test="$TypeProdukt='Trygghet'">
eller sjekke for null:
 
<xsl:if test="$image = null ">
 
 
Globale variabler/scope:
 
For at en variabel skal være global må den defineres som et barn/child av <xsl:stylesheet>
 
f.eks:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
    <xsl:variable name="TypeKontakt">
      <xsl:choose>
        <xsl:when test="//FILE/REC[@NAME=Otto'] or //FILE/REC[@NAME='Jenny']>Venn</xsl:when>
        <xsl:otherwise>Kontakt</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
 
    <xsl:template match="/">
...
 
 
 
Nå er variabelen $TypeKontakt tilgjengelig i hele stylesheetet.
 
Tilsvarende vil en variabel som blir deklarert i en xsl:choose kun være tilgjengelig innenfor den, i en xsl:template kun innenfor den osv.
 
 
 
Parametre:
 
 
Her er et eksempel på hvordan kalle et template med en parameter
koden viser en liste over linker/bokmerker på en side, og det bokmerket som er aktivt får en egen style, mens de andre blir vanlige linker:
 
     <xsl:call-template name="Linker">
         <xsl:with-param name="Aktiv">Dekninger</xsl:with-param>
        </xsl:call-template>
 
 
Templatet linker er så definert slik:
<xsl:template name="Linker">
    <xsl:param name="Aktiv">Person</xsl:param>
    ....
 
 
Variabelen $Aktiv er nå klar for bruk inni templaten
...<xsl:choose>
    <xsl:when test="@ID=$Aktiv">
osv.
 
 
 
 
Komplett XSL for denne funksjonen:
(merk at denne bruker funksjonen node-set som er en extension. Se forrige post for hvordan sette opp denne..)
 
 
 <xsl:template name="Linker">
    <xsl:param name="Aktiv">Person</xsl:param>
   
 

    <xsl:variable name="linkertrygghet">
      <link ID='Person'>Personopplysninger</link>
      <link ID='Dekninger'>Dekninger</link>
      <link ID='Begunstigelse'>Begunstigelse</link>
      <link ID='Pantsettelse' >Pantsettelse</link>
      <link ID='Innbetaling' >Innbetaling</link>
      <link ID='Avtalegiro' >Avtalegiro</link>
      <link ID='Raadgiver' >Rådgiver</link>
    </xsl:variable>
 

    <xsl:variable name="linkerforening">
      <link ID='Person'>Personopplysninger</link>
      <link ID='Innbetaling' >Innbetaling</link>
      <link ID='Avtalegiro' >Avtalegiro</link>
      <link ID='Raadgiver' >Rådgiver</link>
    </xsl:variable>
 
    <xsl:variable name="linkerspar">
      <link ID='Person'>Personopplysninger</link>
      <link ID='InnLiv'>Innbetaling</link>
      <link ID='UtLiv'>Utbetaling</link>
      <link ID='BegunstLiv'>Begunstiget</link>
      <link ID='Avtalegiro'>Avtalegiro</link>
      <link ID='Raadgiver'>Rådgiver</link>
    </xsl:variable>
 
 
 

    <xsl:choose>
      <xsl:when test="$TypeProdukt='Trygghet'">
        <xsl:call-template name='laglinker'>
          <xsl:with-param name='Aktiv' select='$Aktiv'></xsl:with-param>
          <xsl:with-param name='linker' select='$linkertrygghet'></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$TypeProdukt= 'Forening'">
        <xsl:call-template name='laglinker'>
          <xsl:with-param name='Aktiv' select='$Aktiv'></xsl:with-param>
          <xsl:with-param name='linker' select='$linkerforening'></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$TypeProdukt = 'Spar'">
        <xsl:call-template name='laglinker'>
          <xsl:with-param name='Aktiv' select='$Aktiv'></xsl:with-param>
          <xsl:with-param name='linker' select='$linkerspar'></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
 
 
 
  </xsl:template>
 

  <!-- lag linker basert på liste over linker i param-->
  <xsl:template name="laglinker">
    <xsl:param name="Aktiv">Person</xsl:param>
    <xsl:param name="linker"></xsl:param>
 
    <xsl:for-each select="msxsl:node-set($linker)/link">
      <xsl:choose>
        <xsl:when test="@ID=$Aktiv">
          <span class="aktiv">
            <xsl:value-of select="."/>
          </span>
        </xsl:when>
        <xsl:otherwise>
          <a>
            <xsl:attribute name="href">
              #<xsl:value-of select="@ID" />
            </xsl:attribute>
            <xsl:value-of select="."/>
          </a>
 
        </xsl:otherwise>
      </xsl:choose>
 

    </xsl:for-each>
 
  </xsl:template>
 
 
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment