Toon posts:

[XSLT] Variabelen in <xsl:if> statement

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey,

K'ben bezig met een projectje waarin onderandere een aantal formulieren moeten worden gegenereerd..
Ik stuit echter op het volgende probleem:
Bij een optionbox is het altijd leuk als een optie 'preselected' is zeg maar, de 'selected' attribuut in <option>. Nu heb ik de volgende code:
code:
1
2
3
4
5
6
7
8
9
<xsl:for-each select="pppp:SelectSet/pppp:Cat">
    <xsl:param name="cid" select="@cid"/>
    <xsl:if test="@cid=/pppp:All/pppp:Vars/@curCid">
        <xsl:param name="selected" select="'true'"/>
    </xsl:if>
    <option value="{$cid}" selected="{$selected}">
        <xsl:value-of select="."/>
    </option>
</xsl:for-each>

Wat mijn idee was; het cid attribuut van het huidige element vergelijken met de globale variabele $curCid en aan de hand daarvan de selected variabele een waarde geven. Als ik deze code check met xsltproc krijg ik geen fouten, alleen bij het transformeren van de XML (via PHP) krijg ik de volgende fout:
code:
1
2
3
4
5
6
Warning: process() [function.process]:
runtime error: file pppp.xsl element option in /***/xml/pppp.php on line 9
Warning: process() [function.process]:
unregistered variable selected in /***/xml/pppp.php on line 9
Warning: process() [function.process]:
xmlXPathCompiledEval: evaluation failed in /***/xml/pppp.php on line 9

Hopelijk herkent iemand dit probleem of kan mij iig een oplossing vertellen..
Bvd, :)

[ Voor 11% gewijzigd door Verwijderd op 23-02-2003 09:00 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
rhand0z: Bij een optionbox is het altijd leuk als een optie 'preselected' is zeg maar, de 'selected' attribuut in <option>.
Zoals hier dus :) .

[rml][ XSL] Nieuw Probleem[/rml]

code:
1
<xsl:param name="cid" select="@cid"/>

Waarom een param hier? Volgens mij heb je niet helemaal begrepen wat variabelen en params zijn. Ik quote even de recommendation:
As well as being allowed at the top-level, both xsl:variable and xsl:param are also allowed in templates. xsl:variable is allowed anywhere within a template that an instruction is allowed. In this case, the binding is visible for all following siblings and their descendants. Note that the binding is not visible for the xsl:variable element itself. xsl:param is allowed as a child at the beginning of an xsl:template element.
Een param is dus een parameter van een template (of een volledige stylesheet). Je gebruik van param is dus fout.
Wat mijn idee was; het cid attribuut van het huidige element vergelijken met de globale variabele $curCid
Globale variabele? Je gebruik van for-each, param en term globale variabele doet me vermoeden dat je nog niet zo heel erg goed de smaak te pakken hebt van de manier waarop je in XSLT moet denken. Probeer allereerst eens goed met templates te werken: een for-each stijl is typisch voor programmeurs die alleen nog maar met talen als PHP/C/Java/C# hebben gewerkt. Je moet proberen om meerdere templates te gaan gebruiken en deze templates steeds opnieuw op de XML toe te gaan passen. Je kunt met behulp van verschillende templates onder verschillende voorwaarden (de XPath expressie in de match) verschillende situaties gaan afhandelen.

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


Verwijderd

Topicstarter
Je bedoelt dus dat ik eigenlijk voor elk stukje XML tree een template moet maken?
Ik heb nu dit eventjes gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
<xsl:template match="pppp:SelCat">
<b>categorie</b>
<select name="selectCat" onChange="catChange();">
    <xsl:apply-templates select="pppp:Cat"/>
</select>
</xsl:template>

<xsl:template match="pppp:Cat">
<xsl:variable name="cid" select="@cid"/>
<option value="{$cid}"><xsl:value-of select="."/></option>
</xsl:template>

Volgens mij is dit wat je in eerste instantie bedoelt?

Met globale variabele bedoel ik eigenlijk de variabelen die ik voor de eerste <xsl:template match="/"> heb gedefinieerd en dus over de volledige scope beschikbaar zijn. Hoe zou ik deze anders moeten noemen?

Vervolgens terug naar mijn probleem:
Aangezien ik het huidige categorie-id ($curCid) in het begin heb gedefinieerd, wil ik eigenlijk geen gebruik hoeven te maken van een extra attribuut in de XML voor de optie die geselecteerd moet zijn.
Stukje XML:
code:
1
2
3
4
5
6
        <pppp:SelCat>
            <pppp:Cat cid="0">&gt; Selecteer een categorie...</pppp:Cat>
            <pppp:Cat cid="0"/>
            <pppp:Cat cid="1">blaatz0r</pppp:Cat>
            <pppp:Cat cid="2">meer balaat0z0r</pppp:Cat>
        </pppp:SelCat>

In die elementen is de cid voor die opties meegegeven en als bij een optie de cid overeenkomt met de $curCid wil ik graag de option een selected meegeven. Dit is toch niet op te lossen met XPath aangezien het niet in de XML staat?