XSL - XSL Tablas

 
Vista:

XSL Tablas

Publicado por Juanjo (1 intervención) el 14/10/2011 15:08:48
Buenas a todos. Estoy con una web xml y salida xsl. El caso en que estoy generando una tabla a partir de unos datos en xml:
<pagina>
<cuerpo>
<nota>
<texto>Un texto cualquiera</texto>
<texto>Un texto cualquiera</texto>
<texto>Un texto cualquiera</texto>
</nota>
<nota>
<texto>Un texto cualquiera</texto>
<texto>Un texto cualquiera</texto>
</nota>
<nota>
<texto>Un texto cualquiera</texto>
</nota>
<nota>
<texto>Un texto cualquiera</texto>
<texto>Un texto cualquiera</texto>
</nota>
<nota>
<texto>Un texto cualquiera</texto>
</nota>

</cuerpo>
</pagina>
La tabla es muy sencilla, concatena en cada celda los texto de nota. Mi problema es que por cada fila sólo tiene que haber 3 celdas, si hubiese más de 3 nodos, claro. Lo más que he logrado, para este caso, es una 1ª fila de 3 celdas, otra 2ª fila de 1celda, y una 3ª de otra celda. Esto es debido a que al crear la fil, (tr), se crear la celda, (td), y se cierra la fila(tr), con lo cual al crear las otras 2 ya pertenecen a otra fila y no a esa como yo creía. Pero es que no se me ocurre otra cosa.
<xsl:for-each select ="pagina/cuerpo/nota">
<xsl:variable name = "lista" select = "position()"/>
<xsl:if test="$lista mod 4 = 0">
<tr>
<td class = "fondo_posit">
<div class = "posit">
<xsl:for-each select ="./texto"> <xsl:value-of select ="."/>
<br/> </xsl:for-each>
</div>
</td>
</tr>
</xsl:if>

<xsl:if test="$lista mod 4 != 0">
<td class = "fondo_posit">
<div class = "posit">
<xsl:for-each select ="./texto">
<xsl:value-of select ="."/>
<br/> </xsl:for-each>
</div>
</td>
</xsl:if>
</xsl:for-each>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Generación de una tabla con 3 celdas por fila

Publicado por Alejandro (227 intervenciones) el 07/07/2023 00:41:31
El problema que planteas es la generación de una tabla a partir de datos XML, donde cada celda debe contener el texto de la nota. Sin embargo, cada fila debe contener solo 3 celdas, y si hay más de 3 nodos, se deben crear filas adicionales. Actualmente, solo has logrado crear una fila con 3 celdas, seguida de una fila con 1 celda y otra fila con una celda.

Aquí tienes una solución para generar la tabla con el formato deseado:

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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" version="4.01" encoding="UTF-8" doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
 
  <xsl:template match="pagina">
    <html>
      <head>
        <title>XSL - Generación de Tabla</title>
        <style>
          /* Agrega aquí tus estilos CSS */
        </style>
      </head>
      <body>
        <table>
          <xsl:apply-templates select="cuerpo/nota" />
        </table>
      </body>
    </html>
  </xsl:template>
 
  <xsl:template match="nota">
    <xsl:if test="position() mod 3 = 1">
      <tr>
        <xsl:apply-templates select=". | following-sibling::nota[position() &lt; 3]" />
        <xsl:if test="not(following-sibling::nota[position() &lt; 3])">
          <!-- Si no hay más notas para completar la fila, se añaden celdas vacías -->
          <xsl:call-template name="addEmptyCells">
            <xsl:with-param name="count" select="3 - count(. | following-sibling::nota)" />
          </xsl:call-template>
        </xsl:if>
      </tr>
    </xsl:if>
  </xsl:template>
 
  <xsl:template match="nota">
    <td class="fondo_posit">
      <div class="posit">
        <xsl:apply-templates select="texto" />
      </div>
    </td>
  </xsl:template>
 
  <xsl:template match="texto">
    <xsl:value-of select="." />
    <br/>
  </xsl:template>
 
  <xsl:template name="addEmptyCells">
    <xsl:param name="count" select="0" />
    <xsl:if test="$count &gt; 0">
      <td class="fondo_posit">&amp;nbsp;</td>
      <xsl:call-template name="addEmptyCells">
        <xsl:with-param name="count" select="$count - 1" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

En este código, se utiliza una plantilla `<xsl:template match="nota">` para crear las filas de la tabla. Si el número de nota es múltiplo de 3, se inicia una nueva fila y se aplican las plantillas correspondientes a la nota actual y las siguientes dos notas. Si no hay más notas para completar la fila, se añaden celdas vacías mediante la plantilla `<xsl:template name="addEmptyCells">`. Las plantillas `<xsl:template match="nota">` y `<xsl:template match="texto">` se encargan de generar las celdas y el contenido de texto de cada nota, respectivamente.

Recuerda agregar tus estilos CSS personalizados en la sección correspondiente del archivo XSL.

Puedes utilizar este código como base para futuras consultas y personalizarlo según tus necesidades.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar