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 1 | Dato 2 |
| Dato 3 | Dato 4 |
| Dato 5 | Dato 6 |
| Dato 7 | Dato 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.
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"><tr></xsl:param>
<xsl:param name="dopo"></tr></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?
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
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
Proverò la tua soluzione, ma sono sicuro che funzia. Sempre detto che sei un geniaccio!
Ciao e buona PDC!
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




Stampa
Download 
10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!

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"><tr></xsl:param>
<xsl:param name="dopo"></tr></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!!!
Continua »»» | Rispondi »»»