[XSL] Start- en endtag apart outputten (row met 2+ cols)

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
[jump=23381047]Laatste probleem[/jump]


Ik ben aan het prutsen met een heel vervelend XSL lusje.

Ik moet als het ware dit outputten

containerdiv/row
block1block2



Dan krijg ik dus een structuur als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<div>
      <div></div>
      <div></div>
<div>
<div>
      <div></div>
      <div></div>
<div>
<div>
      <div></div>
      <div></div>
<div>

maar dat kan ik dan nooit in één lusje outputten want dan kloppen de (container) divtags (start en end) niet meer met elkaar.

Tot zover kom ik
code:
1
2
3
4
5
6
7
8
9
    <xsl:for-each select="block">
        <xsl:if test="position() mod 2 = 1">
            begin
        </xsl:if>
        <h1><xsl:value-of select="position()" /></h1>
        <xsl:if test="position() mod 2 = 0">
            eind
        </xsl:if>
    </xsl:for-each>

maar waar begin en eind staan, zouden dus eigenlijk <div> resp. </div> moeten staan, maar dat kan dus niet. Hoe moet ik dat oplossen? B)

[ Voor 127% gewijzigd door r0bert op 14-05-2005 19:05 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Wellicht kun je xsl:element gebruiken in plaats van een literal <div> element? :)

Rustacean


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Ik zou niet weten hoe ik dat zou moeten doen..

code:
1
2
3
4
5
6
    <xsl:for-each>
        <xsl:if>
             <xsl:element>
        </xsl:if>
        </xsl:element>
    </xsl:for-each>
klopt niet

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Ik heb het nu zo opgelost, vast niet de beste methode maargoed:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<body>
    <block breedte="200">
        <titel>spullen gestolen</titel>
        <datum>14-05-05</datum>
        <tijd>17:56</tijd>
        <ondertitel>robert1</ondertitel>
        <bericht>dfs fs rgdfgsfg gfdg</bericht>
    </block>
    <block breedte="300">
        <titel>ewrewr werew</titel>
        <datum>14-05-05</datum>
        <tijd>17:56</tijd>
        <ondertitel>robert2</ondertitel>
        <bericht>cafsdf dsf sd fsd </bericht>
    </block>
    <block breedte="300">
        <titel>laatste</titel>
        <datum>14-05-05</datum>
        <tijd>17:56</tijd>
        <ondertitel>robert2</ondertitel>
        <bericht>cafsdf dsf sd fsd </bericht>
    </block>
</body>

code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<xsl:template match="body">
<xsl:for-each select="block">
    <xsl:if test="(position() mod 2 = 0)">
        <div>
            <div class="links">
                <xsl:attribute name="style">
                    width: <xsl:value-of select="../block[position()]/@breedte" />px;
                    _width: <xsl:value-of select="number(../block[position()]/@breedte)-1" />px;
                </xsl:attribute>
                <h1>
                    <span>//</span><xsl:value-of select="../block[position()]/titel" />
                </h1>
                <div class="stlReactie">
                    <span>
                        <xsl:value-of select="../block[position()]/datum" /> 
                        <xsl:value-of select="../block[position()]/tijd" /> | 
                    </span>
                    <xsl:value-of select="../block[position()]/ondertitel" /> 
                </div>
                    <p>
                        <xsl:value-of select="../block[position()]/bericht" />
                    </p>
            </div>
            
            
            <div class="rechts">
                <xsl:attribute name="style">
                    width: <xsl:value-of select="480-number(../block[position()]/@breedte)" />px;
                    _width: <xsl:value-of select="479-number(../block[position()]/@breedte)" />px;
                </xsl:attribute>
                <h1>
                    <span>//</span><xsl:copy-of select="./titel" />
                </h1>
                <div class="stlReactie">
                    <span>
                        <xsl:value-of select="datum" /> 
                        <xsl:value-of select="tijd" /> |
                    </span>
                    <xsl:value-of select="ondertitel" />
                </div>
                    <p>
                        <xsl:value-of select="bericht" />
                    </p>
            </div>
        </div>
    </xsl:if>
<!-- Kijk vooruit voor mogelijk enkele kolommen die overblijven -->
    <xsl:if test="((position()=number(last()-1)) and (last() mod 2 = 1)) or (last() = 1)">
        <div>
            <div class="links"> 
                <xsl:attribute name="style">
                    width: 480px;
                    _width: auto;
                </xsl:attribute>                               
                <h1>
                    <span>//</span><xsl:value-of select="../block[last()]/titel" />
                </h1>
                <div class="stlReactie">
                    <span>
                        <xsl:value-of select="../block[last()]/datum" /> 
                        <xsl:value-of select="../block[last()]/tijd" /> |
                    </span>
                    <xsl:value-of select="../block[last()]/ondertitel" />
                </div>
                    <p>
                        <xsl:value-of select="../block[last()]/bericht" />
                    </p>
            </div>
        </div>     
    </xsl:if>
</xsl:for-each>
</xsl:template>

[anchor=23381047]
alleen wil ik hier graag een copy-of van maken:
code:
1
<xsl:value-of select="../block[position()]/titel" />

maar dat wil dan weer niet omdat ie dan van ieder <block>-element de titel pakt en achter elkaar plakt :?

[ Voor 222% gewijzigd door r0bert op 14-05-2005 19:09 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
*kickje*

Er is toch wel IEMAND die dit weet :?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Hmm niet mogelijk blijkbaar?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Tips zijn ook prima? Of tuts over hoe je goed moet refereren binnen XQuery?

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 13:58

Pelle

🚴‍♂️

r0bert, kicken doen we pas na 1 dag.. dat zou jij toch moeten weten ;)

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
dit is verre van compleet, maar wel een eind in de richting mbt je eerste vraag. xsl:for-each is meestal niet de manier om lastige zaken in xsl op te lossen. "links" en "rechts" zijn hier ff vervangen door "side0" en "side1". e.e.a zal nog wel wat pittiger worden met de breedtes en het laatste element enzo, maar daar heb ik ff geen tijd voor ;)

code:
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
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/body">
        <html>
            <body>
                <xsl:apply-templates select="block"/>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="block">
        <div>
            <xsl:call-template name="lrblock">
                <xsl:with-param name="side" select="position() mod 2" />
            </xsl:call-template>
        </div>
    </xsl:template>
    
    <xsl:template name="lrblock">
        <xsl:param name="side" />
        <div class="side{$side}">
            <h1>
                <span>//</span><xsl:value-of select="titel" />
            </h1>
            <div class="stlReactie">
                <span>
                    <xsl:value-of select="datum" /> 
                    <xsl:value-of select="tijd" /> |
                </span>
                <xsl:value-of select="ondertitel" />
            </div>
            <p>
                <xsl:value-of select="bericht" />
            </p>
        </div>
    </xsl:template>
    
</xsl:stylesheet>

[ Voor 57% gewijzigd door Genoil op 15-05-2005 10:41 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Ok thnq! Zal er vanavond iig naar kijken :) Dan edit ik mijn post wel weer even

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Ok dat werkt wel. Maar ik blijf dan met mijn probleem zitten..

Met bovenstaande code krijg ik dit eruit
code:
1
2
3
4
5
6
<div>
   <div>block1..etc..</div>
</div>
<div>
   <div>block2..etc..</div>
</div>

maar de uitvoer zou dus zo moeten zijn:
code:
1
2
3
4
5
6
7
8
<div>
   <div>block1..etc..</div>
   <div>block2..etc..</div>
</div>
<div>
   <div>block3..etc..</div>
   <div>block4..etc..</div>
</div>

[ Voor 28% gewijzigd door r0bert op 15-05-2005 23:13 ]


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ja idd dat klopte niet...dit is beter:

code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="xml" />
    
    <xsl:template match="/body">
        <html>
            <head>
                <style>
                    div.links, div.rechts {
                        float:left;
                        border:1px solid #000;
                    }
                    div.links, div.laatste {
                        clear:left;
                        border:1px solid #000;
                    }
                </style>
            </head>
            <body>
                <xsl:apply-templates select="block" />
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="block">
        <xsl:if test="position() mod 2 = 1">
            <div>
                <xsl:choose>        
                    <xsl:when test="position() != last()">                      
                        <xsl:call-template name="lrblock">
                            <xsl:with-param name="currentBlock" select="." />
                            <xsl:with-param name="nextBlock" select="following-sibling::block" />
                            <xsl:with-param name="side" select="'links'" />
                        </xsl:call-template>                    
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="lrblock">
                            <xsl:with-param name="currentBlock" select="." />
                            <xsl:with-param name="side" select="'laatste'" />
                        </xsl:call-template>                            
                    </xsl:otherwise>
                </xsl:choose>
            </div>
        </xsl:if>
    </xsl:template>
    
    <xsl:template name="lrblock">
        <xsl:param name="currentBlock" />
        <xsl:param name="nextBlock" />
        <xsl:param name="side" />
        <div class="{$side}">
            <xsl:attribute name="style">
                <xsl:text>width:</xsl:text>
                <xsl:choose>
                    <xsl:when test="$side='links'">
                        <xsl:value-of select="$currentBlock/@breedte" />
                    </xsl:when>
                    <xsl:when test="$side='rechts'">
                        <!-- $nextBlock is hier stiekem previousblock! -->
                        <xsl:value-of select="480-number($nextBlock/@breedte)" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>480</xsl:text>
                    </xsl:otherwise>                    
                </xsl:choose>
                <xsl:text>px;</xsl:text>
            </xsl:attribute>
            <h1>
                <span>//</span><xsl:value-of select="$currentBlock/titel" />
            </h1>
            <div class="stlReactie">
                <span>
                    <xsl:value-of select="$currentBlock/datum" /> 
                    <xsl:value-of select="$currentBlock/tijd" /> |
                </span>
                <xsl:value-of select="$currentBlock/ondertitel" />
            </div>
            <p>
                <xsl:value-of select="$currentBlock/bericht" />
            </p>
        </div>
        <xsl:if test="$side = 'links'">
            <xsl:call-template name="lrblock">
                <xsl:with-param name="currentBlock" select="$nextBlock" />
                <!-- nextBlock wordt hier currentBlock, hetgeen eigenlijk
                niet klopt, maar da's een truucje om de breedte van de linkerblock
                bekend te hebben bij het renderen van de rechter -->
                <xsl:with-param name="nextBlock" select="$currentBlock" />
                <xsl:with-param name="side" select="'rechts'" />
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    
</xsl:stylesheet>

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Hartstikke mooi! Hier ga ik het wel mee oplossen! Denk dat dit ook wel genoeg informatie is voor de search.. Thnq Genoil! :)
Pagina: 1