[XSLT] last() van sibling gebruiken om td rowspan te zetten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wankel
  • Registratie: September 2000
  • Laatst online: 01-07 23:08
Voor een rapport wordt een XML-bericht met XSLT omgewurmd naar HTML.

Dat gaat best aardig, maar voor één veld lukt het niet de layout goed te krijgen.

De structuur per rij van het rapport is als volgt:

V | I | XML1 | XML 2

V = volgnummer
I = indicator (uit bericht1)
XML1 = gegevens uit bericht1 (2 kolommen)
XML2 = gegevens uit bericht2 (2 kolommen)

Voor de dwarsligger is het:
11 Behandelwijze:Motivatie voor behandelwijze 'overig':
overig (11b)Toelichting uit xml2 (11)
repeat2 (11a)
repeat1 (11a)


kolom 1 = hardcoded, hoogte afhankelijk van kol3+1
kolom 2 = leeg, hoogte afhankelijk van kol3+1
kolom 3/4 cel 1 = hardcoded
kolom 3/4 cel 2 = uit XML1 (11b)
kolom 3/4 cel "repeat" = afhankelijk van aantal voorkomens in XML1 (11a)
kolom 5/6 cel 1 = hardcoded
kolom 5/6 cel 1 = uit XML2 (11)

XML1 ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
                    <vak11a>
                        <behWijzeCode>007</behWijzeCode>
                    </vak11a>
                    <vak11a>
                        <behWijzeCode>006</behWijzeCode>
                    </vak11a>
                    <vak11b>
                        <behWijzeOverig>OVERIG BEHWaa aaa aaa  aa</behWijzeOverig>
                    </vak11b>

XML2 ziet er zo uit:
code:
1
2
3
                            <vak11>
                                <motivAndereBehWijze>motivatie van andere behandelwijze </motivAndereBehWijze>
                            </vak11>


Wat ik wil bereiken is dat de rowspan van de "hoge" cellen, afhankelijk wordt van de repeating cellen uit XML1 11a.

Het lukt om het aantal rijen te vinden met:
code:
1
2
3
<xsl:variable name="aantal_nodes">
    <xsl:value-of select="count(../n1:vak11a)"/>
</xsl:variable>


Het lukt me echter niet om die waarde dan weer te gebruiken als attribuut voor de <td> te gebruiken:
code:
1
            <td align="left" valign="top" rowspan="$aantal_nodes" width="3%">


Het aantal nodes kan ik ook vinden met last(), maar het lukt me niet om daarbij de juiste context te zetten. last() kan blijkbaar ook niet gebruikt worden als:
code:
1
<td align="left" valign="top" rowspan=last(vak11a) width="3%">

op die manier snapt de parser het niet meer.

Zit ik op het juiste pad, of zou ik het helemaal anders aan moeten pakken?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Helemaal anders aanpakken. Het lijkt erop alsof je een tabel aan het misbruiken bent voor opmaak, en dat is nogal ouderwets (gebruik CSS). :p Variabelen kun je in XSLT gebruiken als "{$aantal_nodes}", je bent dus {} vergeten.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • wankel
  • Registratie: September 2000
  • Laatst online: 01-07 23:08
pedorus schreef op dinsdag 23 maart 2010 @ 14:19:
Helemaal anders aanpakken. Het lijkt erop alsof je een tabel aan het misbruiken bent voor opmaak, en dat is nogal ouderwets (gebruik CSS). :p
Klopt... Als het meezit, komt er tzt nog een vertaalslag naar CSS :-) De prioriteit ligt nu op het onderhoudbaar maken van de xsl. CSS is daar zeker een onderdeel van, maar in vergelijking met de puinhoop die de xsl was, valt er met CSS maar een marginaal voordeel te behalen.
Variabelen kun je in XSLT gebruiken als "{$aantal_nodes}", je bent dus {} vergeten.
Fantastisch, bedankt!

code:
1
2
3
4
5
6
7
8
9
10
    <xsl:template match="n1:controleItems/n1:vak11b">
        <xsl:variable name="aantal_nodes">
            <xsl:value-of select="count(../n1:vak11a)"/>
        </xsl:variable>
        <xsl:value-of select="last()"/>
        <xsl:value-of select="$aantal_nodes"/>
        <tr>
            <td align="left" valign="top" rowspan="{$aantal_nodes}" width="3%">
                <xsl:text>11 </xsl:text>
            </td>

.. etc. geeft het juiste resultaat.