[XSLT] Variabele in for loop

Pagina: 1
Acties:

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <xsl:template name="tag">
        <xsl:if test="not(name = '$prevchannel')">
            <tr>
                <xsl:attribute name="class">heading</xsl:attribute>
                <th>
                    <xsl:attribute name="colspan">2</xsl:attribute>
                    <xsl:value-of select="name" />
                    <xsl:value-of select="$prevchannel" />
                </th>
            </tr>
            <xsl:variable name="prevchannel" select="name" />
        </xsl:if>
        <xsl:call-template name="settingtag" />
    </xsl:template>

Dit is dus de code die ik heb/had. Hij Was voordat ik hem poste al aangepast om het eea te proberen, maar dat werkte helaas ook niet :(

De for loop zit eentje hoger die deze template aanroept, althans dat was eerst niet het geval totdat ik er een template van gemaakt had. Snap je het nog? :)

In ieder geval... De variabele zit in een for loop, maar dan na het if statement waar ik de variabele nodig heb. Ik check nl of ik een bepaalde tag al gehad heb ivm een kopje in de pagina. Zo niet dan kopje maken, anders niets. Dus ik moet weten waneer een tag van een bepaald type voorbij komt, die moet weer vergeleken worden met de vorige van dat type, als een deel van die string (of een andere value in de subtree) anders moet hij eerst een kopje schrijven met de naam, anders niet.

Technisch gezien moet ik dus een variabele hebben op een plaats waar ik hem niet kan/mag updaten. Eigenlijk zou hij leeg geinitialiseerd moeten worden, of met een andere waarde, en verderop geupdate worden. Kan dit? Zo ja hoe?

The box said 'requires Windows 95 or better', so I installed Linux...


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Probeer eens dit
code:
1
<xsl:variable name="prevchannel" select="name"/>

dus met '/' in de tag. Raar dat sablotron um pakt, terwijl die niet well-formed is.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik zie nergens een for-loop?

Je variabele is absoluut niet zichtbaar in de if-knoop als je hem daar declareert. Je zou hem aan het begin van de template moeten zetten.

Wat wil je sowieso met die prevchannel? Volgens mij wijs je hem hier gewoon het kind 'name' toe. Wat wil je daar verder mee? Het is een beetje vage code :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
|:( Per ongeluk geedit ipv gequote...

Nja, lees dus aub ff de eerste post weer...

The box said 'requires Windows 95 or better', so I installed Linux...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
TheMrH: De for loop zit eentje hoger die deze template aanroept, althans dat was eerst niet het geval totdat ik er een template van gemaakt had. Snap je het nog? :)
Dat gaat dus nooit werken: variabelen in XSLT zijn niet bepaald variabel ;) . De scope van de variabele is beperkte tot de elementen na de knoop waarin hij is gedeclareerd. Je kunt een variabele dus nooit op deze manier gebruiken.

Je zult het dus anders aan moeten pakken: je kunt met behulp van een XPath expressie en een expliciet axis ook wel achterhalen of een bepaalde al eerder in het document is voorgekomen.

Wellicht kan je ook beter iets doen met control-flow of modes. Je zou bij een bepaalde tag over kunnen gaan op een andere mode. Je kunt bij een template een mode opgeven. Als je in een bepaalde mode zit, worden de templates van die mode toegepast.
Technisch gezien moet ik dus een variabele hebben op een plaats waar ik hem niet kan/mag updaten. Eigenlijk zou hij leeg geinitialiseerd moeten worden, of met een andere waarde, en verderop geupdate worden. Kan dit? Zo ja hoe?
Nope, dat kan dus niet :) . XSLT is daarvoor te declaratief en er is ook bewust voor gekozen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment