[XSL] apply-templates splitsen?

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 13:50
Om het volgende probleem: [rml][ CSS] DIV float & clear[/rml] op te lossen wil ik een aantal XML elementen gaan opsplitsen. Element 1 komt links, element 2 rechts, element 3 weer links, etc.
Nu wil ik dit in mijn XSL file oplossen door ipv:
code:
1
2
3
<div>
  <xsl:apply-templates select="./" />
</div>


iets te doen als
code:
1
2
3
4
5
6
<div class="links">
  <xsl:apply-templates select="./" />
</div>
<div class="rechts">
  <xsl:apply-templates select="./" />
</div>


maar bovengenoemde oplossing geeft me uiteraard 2x hetzelfde rijtje. Bestaat er een soort van indexering die het mogelijk maakt om in de linker DIV alleen de oneven, en rechts de even elementen neer te zetten? Het liefste verander ik aan de XML structuur zelf niets, maar als het niet anders kan...

[ Voor 10% gewijzigd door jsiegmund op 23-09-2004 14:35 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
In je xsl een tellertje bijhouden en afhankelijk van teller%2 == 1 of teller%2 == 0 laten kiezen? Weet niet of de syntax klopt voor xsl maar het idee komt denk ik wel duidelijk genoeg naar voren..

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je kunt hiervoor een recursieve functie gebruiken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<xsl:template name="verdeel_kolommen">
  <xsl:param name="index"/>
  <div>
    <xsl:choose>
      <xsl:attribute name="class"
        ><xsl:when test="( $index mod 2 ) = 0">links</xsl:when>
        <xsl:otherwise>rechts</xsl:otherwise
      ></xsl:attribute>
    </xsl:choose>
    <xsl:apply-templates select="/pad/naar/xmlelementen[$index]"/>
  </div>
  <xsl:if test="$index &lt; last(/pad/naar/xmlelementen)">
    <xsl:call-template name="verdeel_kolommen">
      <xsl:with-param name="index" select="$index + 1"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

Het is even een tijdje geleden dus ik weet niet zeker of het klopt zo. Het idee is wel duidelijk hopelijk.

[ Voor 58% gewijzigd door Michali op 23-09-2004 15:09 ]

Noushka's Magnificent Dream | Unity


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 13:50
Als ik jou voorbeeld goed begrijp krijg je dan afwisselend
code:
1
2
3
4
<div class="links">element1</div>
<div class="rechts">element2</div>
<div class="links">element3</div>
<div class="rechts">element4</div>


Maar wat ik graag wil hebben is:
code:
1
2
3
4
5
6
7
8
9
<div class="links">
element1
element3
</div>

<div class="rechts">
element2
element4
</div>


En dat lukt op die manier niet denk ik, maar misschien dat ik alsnog wat met je code kan...

[ Voor 40% gewijzigd door jsiegmund op 23-09-2004 16:04 ]


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 13:50
Even ter verduidelijking ben ik op zoek naar een oplossing voor zoiets:

code:
1
2
3
4
5
6
<div style="width: 300px;">
    <xsl:apply-tempates select="./position() mod 2 = 0" />
</div>
<div>
    <xsl:apply-tempates select="./position() mod 2 <> 0" />
</div>


Dit werkt uiteraard niet, maar misschien is het mogelijk in de apply een variabele mee te geven ofzo, en dan daarop weer te controleren? Ik gooi ook maar wat.

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 13:50
En nog meer pseudo-code die uiteraard niet werkt, maar misschien het probleem verduidelijkt.

code:
1
2
3
4
5
6
7
8
9
10
11
<div class="left">
  <xsl:if test="$node[i].position() mod 2 = 0"> 
    <xsl:apply-templates select="$node"/>
  </xsl:if>
</div>

<div class="right">
  <xsl:if test="$node[i].position() mod 2 <> 0"> 
    <xsl:apply-templates select="$node"/>
  </xsl:if>
</div>

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
iCe01 schreef op 23 september 2004 @ 17:36:
Even ter verduidelijking ben ik op zoek naar een oplossing voor zoiets:

code:
1
2
3
4
5
6
<div style="width: 300px;">
    <xsl:apply-tempates select="./position() mod 2 = 0" />
</div>
<div>
    <xsl:apply-tempates select="./position() mod 2 <> 0" />
</div>


Dit werkt uiteraard niet, maar misschien is het mogelijk in de apply een variabele mee te geven ofzo, en dan daarop weer te controleren? Ik gooi ook maar wat.
LOL je geeft zelf je antwoord zonder dat je het zelf doorhebt.
code:
1
2
3
4
5
6
<div style="width: 300px;">
    <xsl:apply-tempates select="child::*[position() mod 2 = 0]" />
</div>
<div>
    <xsl:apply-tempates select="child::*[position() mod 2 <> 0]" />
</div>

Volgens mij moet dat gewoon werken :D

[ Voor 13% gewijzigd door Michali op 23-09-2004 19:15 ]

Noushka's Magnificent Dream | Unity


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

iets als dit dan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:template match="container">
    <div style="border:1px solid silver; padding:5px;">
        <xsl:apply-templates select="item">
            <xsl:with-param name="offset">1</xsl:with-param>
        </xsl:apply-templates>
    </div>
    <div>
        <xsl:apply-templates select="item">
            <xsl:with-param name="offset">0</xsl:with-param>
        </xsl:apply-templates>
    </div>
</xsl:template>

<xsl:template match="item">
    <xsl:param name="offset" />
    <xsl:if test="position() mod 2 = $offset">
        <xsl:apply-templates />
    </xsl:if>
</xsl:template>


ziet er een beetje raar uit imo, maar het werkt wel :P en ik ben ook geen xsl koning.

edit:
Dat krijg je als je pagina's lang laat open staan, zie je de nieuwe replies niet :+
Michali als dat werkt is dat natuurlijk veel mooier :)

[ Voor 29% gewijzigd door Clay op 23-09-2004 19:28 ]

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Misschien is dit nog interessant: [rml]Genoil in "[ XSL(T)/XML] Transformatie naar XML"[/rml]. Ik heb namelijk ooit met een soortgelijk probleem gezeten :)

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 13:50
Michali schreef op 23 september 2004 @ 19:15:
[...]


LOL je geeft zelf je antwoord zonder dat je het zelf doorhebt.
code:
1
2
3
4
5
6
<div style="width: 300px;">
    <xsl:apply-tempates select="child::*[position() mod 2 = 0]" />
</div>
<div>
    <xsl:apply-tempates select="child::*[position() mod 2 <> 0]" />
</div>

Volgens mij moet dat gewoon werken :D
Perfect, ik wist dat ik in de buurt zat maar dit is inderdaad een beetje overdreven :D
Pagina: 1