Xsl... tabella su più colonne?

L'avevo affrontata tempo fa questa problematica e l'avevo risolta in modo blasfemo secondo me. Ipotizzando di avere un file xml con questi dati:

<?xml version="1.0" encoding="utf-8" ?>
<dati>
 <dato>Dato 1</dato>
 <dato>Dato 2</dato>
 <dato>Dato 3</dato>
 <dato>Dato 4</dato>
 <dato>Dato 5</dato>
 <dato>Dato 6</dato>
 <dato>Dato 7</dato>
 <dato>Dato 8</dato>
</dati>

Con un file xslt, come posso visualizzare una tabella suddividendo questi dati su due colonne in modo da ottenere questo?

Dato 1Dato 2
Dato 3Dato 4
Dato 5Dato 6
Dato 7Dato 8

Sembrava semplice, ma per un non guru dell'xslt mi sono ritrovato di fronte a un bel problema. All'inizio avevo abbozzato questo codice xslt:

<xsl:template match="/">
<p>
<xsl:for-each select="//dati/*">
<xsl:if test="position() mod 2=1"><tr></xsl:if>
<td><xsl:<xsl:value-of select="." /></td>
<xsl:if test="position() mod 2=0"></tr></xsl:if>
</xsl:for-each>
</p>
</xsl:template>

Ma ovviamente essendoci dei tag aperti (<tr> e </tr> nei rispettivi if), questo codice non è valido è non può essere utilizzato. Il risultato era nato dopo una meditazione ad alta quota. La soluzione, che però non trovo ottimale, è la seguente:

a<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="prima">&lt;tr&gt;</xsl:param>
<xsl:param name="dopo">&lt;/tr&gt;</xsl:param>
<xsl:template match="/">
<table border="1px">
<xsl:for-each select="//dati/*">
<xsl:if test="position() mod 2=1">
<xsl:value-of select="$prima" disable-output-escaping="yes" />
</xsl:if>
<td><xsl:value-of select="." /></td>
<xsl:if test="position() mod 2=0">
<xsl:value-of select="$dopo" disable-output-escaping="yes" />
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

L'attributo disable-output-escaping permette di poter visualizzare correttamente il valore di apertura e chiusura riga anche se è stato inserito come parametro in formato escape. Ma c'è una soluzione migliore? Boh.

Nella stessa categoria

Commenti
giuseppe500 scrive:
Xsl... tabella su più colonne?

io sulla falsariga di quello che avete costruito ho fatto un xsl che calcola il colspan a partire dall'xml di input lo posto:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:param name="prima">&lt;tr&gt;</xsl:param>
<xsl:param name="dopo">&lt;/tr&gt;</xsl:param>
<xsl:template match="/">
<table border="1px">

<xsl:for-each select="//pagina/prodotto">

<xsl:value-of select="count(@rowspan[position()=1])"></xsl:value-of>

<xsl:variable name="b" select="position()+(sum(preceding::*/@colspan))-count(preceding::*/@colspan)+($a/@rowspan)"></xsl:variable>



<xsl:if test="$b mod 3=1">
<xsl:value-of select="$prima" disable-output-escaping="yes" />
</xsl:if>


<td><xsl:attribute name="rowspan" ><xsl:value-of select="@rowspan"></xsl:value-of></xsl:attribute><xsl:attribute name="colspan"><xsl:value-of select="@colspan"></xsl:value-of></xsl:attribute>
<xsl:value-of select="descrizione_completa" />variabile:<xsl:value-of select="$b"></xsl:value-of>posizione:<xsl:value-of select="position()"></xsl:value-of></td>

<xsl:if test="$b mod 3=0">
<xsl:value-of select="$dopo" disable-output-escaping="yes" />

</xsl:if>


</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>


il problema viene col rospan e li sono azz...
dovrei fare che per ogni riga di rowspan aggiungo il colspan,ma non so come fare help!!!
26/06/2006 ore 13.14 | 1 risposta
giuseppe500 scrive:
Re: Xsl... tabella su più colonne?

non so come scusarmi , non si puo modificare ed ho sbagliato il codice nel post,è questo:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" versionfiltered="1.0">
<xsl:param name="prima">&lt;tr&gt;</xsl:param>
<xsl:param name="dopo">&lt;/tr&gt;</xsl:param>
<xsl:template match="/">
<table border="1px">

<xsl:for-each select="//pagina/prodotto">

<xsl:variable name="b" select="position()+(sum(preceding::*/@colspan))-count(preceding::*/@colspan)"></xsl:variable>


<xsl:if test="$b mod 3=1">
<xsl:value-of select="$prima" disable-output-escaping="yes" />
</xsl:if>


<td><xsl:attribute name="colspan"><xsl:value-of select="@colspan"></xsl:value-of></xsl:attribute>
<xsl:value-of select="descrizione_completa" />variabile:<xsl:value-of select="$b"></xsl:value-of>posizione:<xsl:value-of select="position()"></xsl:value-of></td>





<xsl:if test="$b mod 3=0">
<xsl:value-of select="$dopo" disable-output-escaping="yes" />
</xsl:if>


</xsl:for-each>
</table>
</xsl:template>
sono mortificato , mi potete aiutare per il rowspan?
26/06/2006 ore 13.32
Ricciolo scrive:
Xsl... tabella su più colonne?

Di questo argomento ne stavamo parlando mentre decollavamo per roma
Questa è la soluzione che propongo io:


<xsl:template match="/">
<table>
<xsl:for-each select="dati/dato[position() mod 2 = 1]">
<tr>
<xsl:call-template name="cell">
<xsl:with-param name="row" select="." />
</xsl:call-template>

<xsl:variable name="pos" select="position()" />
<xsl:call-template name="cell">
<xsl:with-param name="row" select="../dato[2 * $pos]" />
</xsl:call-template>
</tr>
</xsl:for-each>
</table>
</xsl:template>

<xsl:template name="cell">
<xsl:param name="row" />

<td>
<xsl:value-of select="$row" />
</td>
</xsl:template>

Il template è solo per non ripetere il td o altri style
09/09/2005 ore 23.37 | 1 risposta
andrewz scrive:
Re: Xsl... tabella su più colonne?

Ricciolo <Ricciolo> ha scritto:
Di questo argomento ne stavamo parlando mentre decollavamo per roma

Ricordo, ma non mi ricordovo il suggerimento che mi avevi dato  Chiedo venia.
Proverò la tua soluzione, ma sono sicuro che funzia. Sempre detto che sei un geniaccio!
Ciao e buona PDC!
10/09/2005 ore 7.46

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - AZ - Il blog di Andrea Zani

TagCloud
BLOG INFO
  • Post: 267
  • Commenti: 171
  • TrackBacks: 35
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML

MVP
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA