XSL - tabla de xls

 
Vista:

tabla de xls

Publicado por Carlos (1 intervención) el 01/03/2019 16:31:58
Buenas, tengo un xlm y tneog que hacer que quede
un titulo que se llame clases de tango
una imagen
una tabla donde vienen profesor, noº de plazas y horario(horario tiene 2 columnas solapadas)
ahora profesor es uno solo por lo que solapan 3 filas
nº de plazas igual
y horario son 2 columnas una para los dias y otra para las horas
luego debajo tiene que aparecer otra tabla que se llame matriculados y aparece el nombre con los apellidos en una columna y el dni de los alumnos en otra (pero sin titulo de columna)
explicado esto os pongo el xlm y mi xsl y os planteo el problema (el xlm es solo parte porque solo interesa una parte no os lo pngo entero)
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
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="baile.xsl"?>
<academia nombre="Trassierra">
    <curso id="C1" inicio="2019/10/01" fin="2020/06/30" nivel="intermedio">
        <baile>tango</baile>
        <imagen>imagenes/tango.jpeg</imagen>
        <profesor>Ricardo Buenos Aires</profesor>
        <sala>1</sala>
        <plazas>10</plazas>
        <horario>
            <dia>lunes</dia>
            <hora>17:00:00</hora>
            <dia>miercoles</dia>
            <hora>18:30:00</hora>
            <dia>viérnes</dia>
            <hora>18:00:00</hora>
        </horario>
        <precio cuota="trimestral">55</precio>
        <matriculas>
            <alumno>
                <dni>30987123Z</dni>
                <nombre>Jose Maria Ortiz Ots</nombre>
            </alumno>
            <alumno>
                <dni>29876013J</dni>
                <nombre>Maria Gonzalo Hernandez</nombre>
            </alumno>
        </matriculas>
    </curso>

xls
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"/>
    <xsl:template match="/">
        <html>
            <head>
                <title>baile.xsl</title>
            </head>
            <body>
                <h1>Curso de tango</h1>
                <table border="1" style="border-collapse:separate;border-spacing:2px">
                    <tr>
                        <th style="text-aling:left">Profesor</th>
                        <th style="text-aling:left">Nº Plazas</th>
                        <th style="text-aling:left">Horario</th>
                        <th style="text-aling:left">Horario2</th>
                    </tr>
                    <xsl:for-each select="academia/curso">
                        <xsl:if test="curso='tango'">
                            <xsl:variable name="recordCount" select="count(academia/cursohorario/dia)">
                            <tr>
                                <td rowspan="{$recordCount}">
                                    <xsl:value-of select="profesor"/>
                                </td>
                                <td rowspan="{$recordCount}">
                                    <xsl:value-of select="plazas"/>
                                </td>
                                <td>
                                    <xsl:value-of select="horario/dia"/>
                                </td>
                                <td>
                                    <xsl:value-of select="horario/hora"/>
                                </td>
                            </tr>
                            </xsl:variable>
                        </xsl:if>
                    </xsl:for-each>
                </table>
                <h2>Matriculados</h2>
                <table border="1" style="border-collapse:separate;border-spacing:2px">
                    <xsl:for-each select="academia/curso/baile/matriculas">
                        <xsl:if test="baile='tango'">
                            <tr>
                                <td>
                                    <xsl:value-of select="alumno/nombre"/>
                                </td>
                                <td>
                                    <xsl:value-of select="alumno/dni"/>
                                </td>
                            </tr>
                        </xsl:if>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

mi problema es que los dato de las tablas no me cargan y no se porque
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

Generar tablas con datos de un XML en XSLT

Publicado por Alejandro (227 intervenciones) el 07/07/2023 18:50:01
El problema en tu archivo XSLT se encuentra en las expresiones XPath utilizadas en el bucle `xsl:for-each`. Hay un par de errores en las rutas XPath que están causando que los datos no se muestren correctamente.

Aquí está la solución corregida:

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
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>baile.xsl</title>
      </head>
      <body>
        <h1>Curso de tango</h1>
        <table border="1" style="border-collapse:separate;border-spacing:2px">
          <tr>
            <th style="text-align:left">Profesor</th>
            <th style="text-align:left">Nº Plazas</th>
            <th style="text-align:left">Horario</th>
            <th style="text-align:left">Horario2</th>
          </tr>
          <xsl:for-each select="academia/curso[baile='tango']">
            <xsl:variable name="recordCount" select="count(horario/dia)"/>
            <xsl:for-each select="horario">
              <tr>
                <xsl:if test="position() = 1">
                  <td rowspan="{$recordCount}">
                    <xsl:value-of select="../profesor"/>
                  </td>
                  <td rowspan="{$recordCount}">
                    <xsl:value-of select="../plazas"/>
                  </td>
                </xsl:if>
                <td>
                  <xsl:value-of select="dia"/>
                </td>
                <td>
                  <xsl:value-of select="hora"/>
                </td>
              </tr>
            </xsl:for-each>
          </xsl:for-each>
        </table>
        <h2>Matriculados</h2>
        <table border="1" style="border-collapse:separate;border-spacing:2px">
          <xsl:for-each select="academia/curso[baile='tango']/matriculas/alumno">
            <tr>
              <td>
                <xsl:value-of select="nombre"/>
              </td>
              <td>
                <xsl:value-of select="dni"/>
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

En esta solución corregida, se han realizado los siguientes cambios:

- En el primer bucle `xsl:for-each`, se ha corregido la expresión XPath para seleccionar los cursos de tango: `select="academia/curso[baile='tango']"`.
- Dentro del bucle `xsl:for-each` del horario, se ha cambiado la expresión XPath para seleccionar el profesor y las plazas correspondientes a cada curso de tango: `../profesor` y `../plazas`.
- En el segundo bucle `xsl:for-each`, se ha corregido la expresión XPath para seleccionar los alumnos matriculados en los cursos de tango: `select="academia/curso[baile='tango']/matriculas/alumno"`.

Con estas correcciones, los datos deberían cargarse correctamente en las tablas generadas por el XSLT a partir del XML. Asegúrate de que los archivos XML y XSLT estén en la misma carpeta y que el archivo XML esté correctamente enlazado al archivo XSLT para que la transformación funcione correctamente.
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