Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[XSLT] xml omzetten naar tabel

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het volgende probleem:

ik wil van de onderstaande xml

[code]
<cols>
<col1>
<rows>
<row1>
<name>name1</name>
<description>description1</description>
</row1>
<!-- other row1s -->
</rows>
</col1>
<col2>
<rows>
<row2>
<name>name2</name>
<description>description2</description>
</row2>
<!-- other row2s -->
</rows>
</col2>
<col3>
<rows>
<row3>
<name>name3</name>
<description>description3</description>
</row3>
<!-- other row3s -->
</rows>
</col3>
</cols>

[code]

omzetten naar

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
<table border="1">

    <!-- a row -->
    <tr>
        <table border="1">
            <tr>
                <!-- col1 -->
                <td>col1/row1/name</td>
        
                <!-- col2 -->
                <td>col2/row2/name</td>
        
                <!-- col3 -->
                <td>col3/row3/name</td>
         
            </tr>
            <tr>
             <!-- col1 -->
             <td>col1/row1/description</td>
        
             <!-- col2 -->
             <td> col2/row2/description</td>
        
             <!-- col3 -->
             <td> col3/row3/description</td>
         
            </tr>
        </table>
   </tr>
   
    <!-- other rows -->
</table>



ik wil het bovenstaande resultaat met de volgende xslt template bereiken:
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
 <xsl:template name="cols">
    <html>
      <head>
        <title>Untitled Page</title>
      </head>
      <body>
        <table border="1">

        <xsl:for-each select="/cols/col1/rows/row1">
          <xsl:variable name="row1Pos" select="position()"/>
          
          <!-- a row -->
          <tr>
            <table border="1">
              <!-- name -->
              <tr>
                <!-- col1 -->
                <td>
                  <xsl:value-of select="name[position() = $row1Pos]"/>
                </td>

                <!-- col2 -->
                <td>
                  <xsl:value-of select="/cols/col2/rows/row2/name[position() = $row1Pos]"/>
                </td>
                

                <!-- col3 -->
                <td>
                  <xsl:value-of select="/cols/col3/rows/row3/name[position() = $row1Pos]"/>
                </td>

              </tr>
              <tr>
                <!-- col1 -->
                <td>
                  <xsl:value-of select="/cols/col1/rows/row1/description[position() = $row1Pos]"/>
                </td>

                <!-- col2 -->
                <td>
                  <xsl:value-of select="/cols/col2/rows/row2/description[position() = $row1Pos]"/>
                </td>

                <!-- col3 -->
                <td>
                  <xsl:value-of select="/cols/col3/rows/row3/description[position() = $row1Pos]"/>
                </td>

              </tr>
            </table>
          </tr>
          
          <!-- other rows -->
          </xsl:for-each>
          
          
        </table>
      </body>
    </html>
  </xsl:template>


Het bovenstaand werkt template doorloopt alleen alle cols/col1/rows/row1.

Het is de bedoeling dat de template ook alle cols/col2/rows/row2 en cols/col3/rows/row3 rijen doorlopen maar met huidige xslt kennis weet ik niet hoe ik dit moet bereiken.


Kan iemand mij misschien de juist richting wijzen?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-11 23:16

TeeDee

CQB 241

Een 2e for-each toevoegen? Eventueel ook wat minder specific cols/col etc. toe wijzen?
En anders, weet niet of het kan in xsl, kan je kijken naar een recursieve function.


In the English Dictionary:
- Recursion: (see Recursion)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Variabelen kun je maar een keer assignen in XSLT. Je zult dus of meer variabelen moeten declaren of meer/andere templates moeten maken.

On track


  • redfox314
  • Registratie: December 2004
  • Laatst online: 07-11 14:35
ik denk dat je vooral je row indices niet mag hardcoden (maakt het nogal unextensible wat net de kracht van xml is).
Gebruik gewoon attributen om je row indices te namen.
je kan de elementen selecteren met @
als je alle elementen met rowindex i wilt selecteren (het attribuut noemt dan rowindex)
code:
1
2
/cols/col/rows/row[@rowindex=i]
<!-- ben niet helemaal zeker van dit stukje code de @ kan niet nodig zijn-->
Verwijderd schreef op dinsdag 22 april 2008 @ 17:01:

code:
1
        <xsl:for-each select="/cols/col1/rows/row1">


Het bovenstaand werkt template doorloopt alleen alle cols/col1/rows/row1.

Het is de bedoeling dat de template ook alle cols/col2/rows/row2 en cols/col3/rows/row3 rijen doorlopen maar met huidige xslt kennis weet ik niet hoe ik dit moet bereiken.


Kan iemand mij misschien de juist richting wijzen?
de xpath expressie in de for-each selecteert het row1 kind van rows kind van col1 kind van cols
vermits je maar 1 col1 element hebt gaat die niet itereren over niet col1 elementen.

in je huidige structuur kan je zeggen om een for-each over alle kinderen van cols te doen

code:
1
        <xsl:for-each select="/cols/*">


met daarin een geneste for-each over de rows

let er wel op dat de beginslash op dezelfde manier werkt als in een unix filesystem

in de structuur die ik hierboven voorstelde kan je itereren over /cols/col wat wil zeggen dat je op het niveau van die col nog andere elementen kan toevoegen zonder je xslt kapot te doen.

de betekenis van al die expressions ga je niet vinden onder xslt maar eerder onder xpath.
http://www.w3schools.com/xpath/default.asp