Xsl... tabella su più colonne?

di Andrea Zani, in .NET,

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"><tr></xsl:param>
<xsl:param name="dopo"></tr></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.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese