[XSL] een variable uit de vorige groep meenemen

Pagina: 1
Acties:

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
Wel, ik ben bezig met een nieuw project; een website dat op zSeries/Websphere draait. Er wordt o.a. XML gebruikt voor de communicatie tussen de website en diverse DB servers. Met behulp van XSL kan ik alle informatie uit XML van een mooi HTML jasje voorzien. Er worden voornamelijk tabellen gemaakt met behulp van <xsl:for-each>. Hieronder volgt een voorbeeldje:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<tr>
  <td>
    <table border="0" cellpadding="2" cellspacing="0" width="100%">
      <th>kop 1</th>
      <th>kop 2</th>

      <xsl:for-each select="blaat">
        <xsl:variable name="x">
          <xsl:choose>
            <xsl:when test="position() mod 2 = 1">bg_wit</xsl:when>
            <xsl:otherwise>bg_blauw</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>

        <tr class="{$x}">                
          <td>cel 1</td>
          <td>cel 2</td>
          <td>cel 3</td>
        </tr>

      </xsl:for-each>

    </table>
  </td>
</tr>


Dit levert bijvoorbeeld op:

kop 1kop 2
rij 1 col 1rij 1 col 2
rij 2 col 1rij 2 col 2
rij 3 col 1rij 3 col 2


Maar volgens de IBM layout-specs moet er een dunne blauwe streep onderaan de tabel worden toegevoegd, wanneer de laatste rij wit is. Ziehier het voorbeeld zoals het moet:

kop 1kop 2
rij 1 col 1rij 1 col 2
rij 2 col 1rij 2 col 2
rij 3 col 1rij 3 col 2


Jullie snappen vast wel dat ik achteraf naar de laatste waarde van het variable $x moet kijken om te bepalen of die dunne blauwe streep eronder zou moeten komen. Ik heb het volgende geprobeerd:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<tr>
  <td>
    <table border="0" cellpadding="2" cellspacing="0" width="100%">
      <th>kop 1</th>
      <th>kop 2</th>

      <xsl:for-each select="blaat">
        <xsl:variable name="x">
          <xsl:choose>
            <xsl:when test="position() mod 2 = 1">bg_wit</xsl:when>
            <xsl:otherwise>bg_blauw</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>

        <tr class="{$x}">                
          <td>cel 1</td>
          <td>cel 2</td>
          <td>cel 3</td>
        </tr>

      </xsl:for-each>

    </table>
  </td>
</tr>

<xsl:choose>
  <xsl:when test="$x='hil'">

    <tr height="1" class="bg_blauw">
      <td><img src="//www.ibm.com/i/c.gif" /></td>
    </tr>

  </xsl:when>
</xsl:choose>


Maar dan spuugt Websphere de volgende foutmelding uit in de errorlog :?

Wed Jan 22 13:58:54 GMT+00:00 2003 Xml2html: getStylesheet: Transform stylesheet error=javax.xml.transform.TransformerConfigurationException: org.apache.xml.utils.WrappedRuntimeException: Could not find variable with the name of x


Ik ben niet zo'n held met XSL, maar ik ben al gauw tot de conclusie gekomen dat de variable $x de groep <xsl:for-each> niet kan verlaten. Dus: hoe kan ik die variable $x uit de vorige groep meenemen? Ik heb al een uurtje zitten googlen en zitten 'spelen' met XSL, maar nee.. Hier in mijn omgeving is er maar één XSL guru, maar laat hij nou op wintersport zijn en de XSL Bible in zijn kast opgesloten te hebben :/ Hierbij dus mijn beroep op jullie :)

Natuurlijk zijn er (nasty) workarounds mogelijk, zoals achter elke rij standaard een 1px bg_blue lijntje mee te geven, maar dat is natuurlijk niet de bedoeling ;)

[ Voor 3% gewijzigd door BalusC op 22-01-2003 15:26 . Reden: cellpadding="2" toegevoegd.. ]


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      <xsl:for-each select="blaat">
        <xsl:variable name="x">
          <xsl:choose>
            <xsl:when test="position() mod 2 = 1">bg_wit</xsl:when>
            <xsl:otherwise>bg_blauw</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>

        <tr class="{$x}">                
          <td>cel 1</td>
          <td>cel 2</td>
          <td>cel 3</td>
        </tr>

         <xsl:if test="position() = last() and $x = 'bg_wit'">
            <!-- maak een lijntje -->
         </xsl:if>

      </xsl:for-each>

zoiets?

[ Voor 22% gewijzigd door marcusk op 22-01-2003 15:17 ]


  • Willem
  • Registratie: Februari 2001
  • Laatst online: 16:53
Ehm, je kunt bijvoorbeeld alle onderste cellen een style of class meegeven:
style="border-bottom:1px solid #0000ff;" of is dat niet wat je bedoelt?

Motor (of auto) onderhoud bijhouden


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
Dat is een mooie oplossing :) Maar ik heb het nadeel dat deze cellen in een <table cellpadding="2"> zitten, waardoor het lijntje 5px dik wordt.. Vandaar dat ik het lijntje pas ná de tabel wil zetten.

[ Voor 46% gewijzigd door BalusC op 22-01-2003 15:24 ]


  • Willem
  • Registratie: Februari 2001
  • Laatst online: 16:53
zou toch echt style classes definieren, helemaal voor je tabel, maar goed :)

Motor (of auto) onderhoud bijhouden


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
_O_ willem169: jouw oplossing heeft gewerkt :)

Eens afwachten of onze IT Architect deze oplossing toestaat :X ;)

edit:
Werkt niet @ NS47, maar er werken wel meer dingen niet daarop :z ;)

[ Voor 27% gewijzigd door BalusC op 22-01-2003 15:48 ]


  • Willem
  • Registratie: Februari 2001
  • Laatst online: 16:53
Klopt.. maar dan heb je het ook over een browser...

Motor (of auto) onderhoud bijhouden


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
w169: Ik vat je niet helemaal, denk ik..?

Maargoed, ontopic: mag ik nu dus concluderen dat $x gewoonweg niet buiten de groep waarin deze gedefiniëerd is gebruikt kan worden?

Edit: deze class mocht niet dus van onze architect gebruikt worden.. Maar ik heb onderhand al een andere workaround gevonden:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xsl:if test="position() = last() and $x = 'hil'">
  <xsl:text disable-output-escaping="yes">
        &lt;/table&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr height="1" class="lbg"&gt;
      &lt;td colspan="8"&gt;
        [img]//www.ibm.com/i/c.gif[/img]
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;table border="0" cellpadding="2" cellspacing="0" width="100%"&gt;
  </xsl:text>
</xsl:if>


Ik heb dus de oplossing van marcusk gebruikt in combinatie met een soort omzeiling van de tabel.

Waarom niet met [nohtml]> en <[/nohtml] dan :?
Nou, het is simpel: wanneer ik het volgende gebruik:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<xsl:if test="position() = last() and $x = 'hil'">
      </table>
    </td>
  </tr>
  <tr height="1" class="lbg">
    <td>
      <img src="//www.ibm.com/i/c.gif" />
    </td>
  </tr>
  <tr>
    <td>
      <table border="0" cellpadding="2" cellspacing="0" width="100%">
</xsl:if>
dan gaat de XSL parser miepen dat de tags niet in de orde zijn :X ;)

Nogmaals thanx voor het inkoppertje, marcusk :)

[ Voor 94% gewijzigd door BalusC op 22-01-2003 16:49 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Wat ongelofelijk ranzig. Je gaat toch geen tekst produceren ipv well-formed XML omdat je er even niet helemaal uit komt? Als jullie "architect" dit goed keurt, zou ik hem persoonlijk direct de laan uit sturen.

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Om nog even wat bij te dragen ipv alleen commentaar te leveren ;) : je 'probleem' is opgelost als je XSLT op de juiste wijze gaat gebruiken. Dat betekent: zoveel mogelijk gebruik maken van templates en het beperken van for-each gebruik. XSLT is opgezet om met meerdere templates te werken en XML met behulp van deze templates te herschrijven naar andere XML. Als je deze opzet niet toepast (meestal door een pure imperatieve achtegrond), kom je al snel flink in de problemen. Ik zou dus proberen om m'n algemene stijl flink te verbeteren en dan pas dit concrete probleem op te gaan lossen.

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


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Topicstarter
mbravenboer schreef op 22 januari 2003 @ 17:01:
Wat ongelofelijk ranzig. Je gaat toch geen tekst produceren ipv well-formed XML omdat je er even niet helemaal uit komt? Als jullie "architect" dit goed keurt, zou ik hem persoonlijk direct de laan uit sturen.
My thoughts exactly.. Imagine the :X smileys ;)
mbravenboer schreef op 22 januari 2003 @ 17:06:
Om nog even wat bij te dragen ipv alleen commentaar te leveren ;) : je 'probleem' is opgelost als je XSLT op de juiste wijze gaat gebruiken. Dat betekent: zoveel mogelijk gebruik maken van templates en het beperken van for-each gebruik. XSLT is opgezet om met meerdere templates te werken en XML met behulp van deze templates te herschrijven naar andere XML. Als je deze opzet niet toepast (meestal door een pure imperatieve achtegrond), kom je al snel flink in de problemen. Ik zou dus proberen om m'n algemene stijl flink te verbeteren en dan pas dit concrete probleem op te gaan lossen.
Wel, zoveel speelruimte heb ik nog niet. Ik heb geen vat op de parser en ik moet gebruik maken van de bestaande stylesheets die reeds zijn vastgelegd. De XML stylesheets worden namelijk ook voor andere websites gebruikt (o.a. Intranet). Dan moet je wel een beetje creatief zijn ;)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
BalusC: My thoughts exactly.. Imagine the :X smileys ;)
Mooi ;) .
Wel, zoveel speelruimte heb ik nog niet. Ik heb geen vat op de parser en ik moet gebruik maken van de bestaande stylesheets die reeds zijn vastgelegd. De XML stylesheets worden namelijk ook voor andere websites gebruikt (o.a. Intranet). Dan moet je wel een beetje creatief zijn ;)
Dat maakt op zich niet zo erg veel uit: je kan de for-each oplossing van hierboven met behoud van betekenis zonder enig probleem herschrijven naar een template gebaseerde oplossing. Dit zou je een refactoring kunnen noemen, een bekende term in OO-design. Stylesheets (CSS neem ik aan?) hebben niet echt te maken met de manier waarop je een transformatie implementeert in XSLT.

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

Pagina: 1