Vullen van HTML tabel vanuit XML lijst

Status
Niet open voor verdere reacties.

mjvis

Gebruiker
Lid geworden
29 apr 2009
Berichten
17
Een tabel van 1 kolom vullen vanuit een XML-lijst lukt me wel, maar hoe doe ik dat met een tabel van meerdere kolommen?

voorbeeld

XML:
<klant>
<code>123</code>
<naam>abc</naam>
</klant>

XSL:
<table>
<tr>
<td>CODE</td>
<td>NAAM</td>
</tr>
<xsl:for-each select="klant\code">
...?...
</xsl:for-each>
</table>

Kan iemand mij vertellen wat er moet komen te staan op de plaats van "...?...".
Alvast bedankt.
 
Hey waarschijnlijk heb je hier wel wat aan:

PHP:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <html>
  <body>
    <table border="2" bgcolor="yellow">
      <tr>
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="CATALOG/CD">
      <tr>
        <td><xsl:value-of select="TITLE"/></td>
        <td><xsl:value-of select="ARTIST"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

en dit is een deel van de xml die erbij hoort..
PHP:
<?xml version="1.0" encoding="ISO8859-1" ?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
.
.
.
 
Dit is niet helemaal wat ik bedoel. Maar ik zie dat dat aan mijn vraagstelling ligt.
Het antwoord dat je geeft zorgt dat elk veld in een aparte cel staat. Het is echter de bedoeling alle velden in één cel komen.

Dus eigenlijk:

------------------------------------------
| code | code | code |
| klant | klant | klant |
------------------------------------------
| code | code | code |
| klant | klant | klant |
------------------------------------------
 
heb je dit al geprobeerd?
PHP:
<tr>
<td><xsl:value-of select="klant"/><xsl:value-of select="code"/></td>
</tr>

eventueel nog een <br> ertussen..
 
Ik heb nu het volgende geprobeerd:


<xsl:if test='klantenlijst/klant/code!=""'>
<table>
<xsl:for-each select="klantenlijst/klant/code">
<xsl:sort select="klantenlijst/klant/code" />
<tr>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:if>


het resultaat is:

-----------------------------------------------
| code1 | code2 | code3 | code4 |
| klant1 | klant2 | klant3 | klant4 |
-----------------------------------------------
| code1 | code2 | code3 | code4 |
| klant1 | klant2 | klant3 | klant4 |
-----------------------------------------------

het resultaat zou moeten zijn:
-----------------------------------------------
| code1 | code2 | code3 | code4 |
| klant1 | klant2 | klant3 | klant4 |
-----------------------------------------------
| code5 | code6 | code7 | code8 |
| klant5 | klant6 | klant7 | klant8 |
-----------------------------------------------

Gaat dus niet helemaal goed.
 
<xsl:if test='klantenlijst/klant/code!=""'>
<table>
<xsl:for-each select="klantenlijst/klant/code">
<xsl:sort select="klantenlijst/klant/code" />
<tr>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
</tr>
<tr>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
<td width="25%">
<p align="center">
<a target="_blank" href="{klantenlijst/klant/code}">
<xsl:value-of select="klantenlijst/klant/code"/><BR/><xsl:value-of select="klantenlijst/klant/naam"/>
</a>
</p>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:if>
 
Je hebt hier gewoon 2 rijen gemaakt. Maar wat nu als niet bekent is hoeveel rijen er in totaal gevult gaan worden? Op deze manier kan ik net zo goed platte HTML schrijven zonder een XML-lijst toe te passen.
 
status

Ik heb nu het volgende geprobeerd:

XML:
<klantenlijst>
<klant>
<code>ABC</code>
<naam>Klant ABC</naam>
<ssm>Pietje</ssm>
<sdm>Jantje</sdm>
<team>Zuid</team>
</klant>
<klant>
<code>XYZ</code>
<naam>Klant XYZ</naam>
<ssm>Pietje</ssm>
<sdm>Henk</sdm>
<team>Noord</team>
</klant>
... etc ... (aantal klanten is varierend)
</klantenlijst>


XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table>
<xsl:for-each select="klantenlijst/klant">
<xsl:sort select="code"/>
<tr>
<td>
<p align="center">
<a target="_blank" href="http://.../{code}">
<b><xsl:value-of select="code"/></b><br/>
<xsl:value-of select="naam"/>
</a>
</p>
</td>
<td>
<p align="center">
<a target="_blank" href="http://.../{code}">
<b><xsl:value-of select="code"/></b><br/>
<xsl:value-of select="naam"/>
</a>
</p>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>


Dit geeft het volgende resultaat:
------------------------------------
| ABC | ABC |
| Klant ABC | Klant ABC |
------------------------------------
| XYZ | XYZ |
| Klant XYZ | Klant XYZ |
------------------------------------
...(aantal rijen afhankelijk van aantal klanten)


Het gewenste resultaat moet zijn:
------------------------------------
| ABC | XYZ |
| Klant ABC | Klant XYZ |
------------------------------------
| ... | |
| Klant ... | ... |
------------------------------------
...(aantal rijen afhankelijk van aantal klanten)


Hoe krijg ik dat voor elkaar?
 
status

Nu heb ik het volgende funtie gevonden: "following"

De XSL wordt dan:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table>
<xsl:for-each select="klantenlijst/klant">
<xsl:sort select="code"/>
<tr>
<td>
<p align="center">
<a target="_blank" href="http://.../{code}">
<b><xsl:value-of select="code"/></b><br/>
<xsl:value-of select="naam"/>
</a>
</p>
</td>
<td>
<p align="center">
<a target="_blank" href="http://.../{following::node()/code}">
<b><xsl:value-of select="following::node()/code"/></b><br/>
<xsl:value-of select="following::node()/naam"/>
</a>
</p>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

Dit gaat goed zolang je maar 2 kolommen in de tabel hebt. Maar als je er 3 of meer hebt, dan hebben kolommen 3 en verder de zelfde waarden als kolom 2. Dit gaat dus ook niet goed. :(
 
oplossing

----
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="AantalKlanten" select="count(/customers/customer)"/>
<xsl:variable name="AantalKolommen" select="4"/>
<xsl:variable name="TotaalCellen" select="$AantalKlanten"/>
<xsl:variable name="ExtraCellen" select="$TotaalCellen mod $AantalKolommen"/>
<xsl:template match="/">
<p><br/>
<xsl:if test="$AantalKlanten &gt; 0">
<table>
<xsl:call-template name="Tabel"/>
</table>
</xsl:if>
</p>
</xsl:template>
<xsl:template name="Tabel">
<xsl:param name="Index" select="1"/>
<xsl:if test="$Index &lt; $AantalKlanten">
<xsl:call-template name="Regel"><xsl:with-param name="Index" select="$Index"/></xsl:call-template>
<xsl:call-template name="Tabel">
<xsl:with-param name="Index" select="$Index + $AantalKolommen"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="Regel">
<xsl:param name="Index" select="1"/>
<tr>
<xsl:call-template name="Cel">
<xsl:with-param name="Index" select="$Index"/>
<xsl:with-param name="Teller" select="$Index + $AantalKolommen - 1"/>
</xsl:call-template>
</tr>
</xsl:template>
<xsl:template name="Cel">
<xsl:param name="Index" select="1"/>
<xsl:param name="Teller" select="1"/>
<td>
<p align="center">
<xsl:for-each select="/customers/customer">
<xsl:sort order="ascending" select="name"/>
<xsl:if test="position() = $Index'">
<strong><xsl:value-of select="code"/></strong><br/>
<img border="0" hspace="0" align="middle" src="{code}.jpg"/><br/>
<xsl:value-of select="name"/><br/>
</xsl:if>
</xsl:for-each>
</p>
</td>
<xsl:if test="$Teller &gt; $Index">
<xsl:call-template name="Cel">
<xsl:with-param name="Index" select="$Index + 1"/>
<xsl:with-param name="Teller" select="$Teller"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
----

EDIT: elke :P staat natuurlijk voor : p
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan