XSL - transformación

 
Vista:
sin imagen de perfil
Val: 1
Ha mantenido su posición en XSL (en relación al último mes)
Gráfica de XSL

transformación

Publicado por rodic (1 intervención) el 08/04/2019 19:33:07
Hola, estoy realizando un ejercicio de conversión y adaptación de XML y tengo un par de dudas, en primer lugar os copio los códigos:

XML:

3 <notas>
4 <alumno convocatoria="Septiembre">
5 <nombre>Carlos</nombre>
6 <apellidos>Amaya Arozamena</apellidos>
7 <matricula>m019843</matricula>
8 <cuestionarios>8.0</cuestionarios>
9 <tareas>8.0</tareas>
10 <examen>6.0</examen>
11 <final>8.0</final>
12 </alumno>
13 <alumno convocatoria="Junio">
14 <nombre>Jose</nombre>
15 <apellidos>Muñoz Soto</apellidos>
16 <matricula>m019872</matricula>
17 <cuestionarios>7.0</cuestionarios>
18 <tareas>9.0</tareas>
19 <examen>7.0</examen>
20 <final>8.5</final>
21 </alumno>
22 <alumno convocatoria="Junio">
23 <nombre>Ana</nombre>
24 <apellidos>Martinez de la Fuente</apellidos>
25 <matricula>m097215</matricula>
26 <cuestionarios>8.0</cuestionarios>
27 <tareas>9.0</tareas>
28 <examen>9.0</examen>
29 <final>8.5</final>
30 </alumno>
31 <alumno convocatoria="Septiembre">
32 <nombre>Roberto</nombre>
33 <apellidos>Carrera Fernández</apellidos>
34 <matricula>m059312</matricula>
35 <cuestionarios>6.0</cuestionarios>
36 <tareas>7.0</tareas>
37 <examen>6.0</examen>
38 <final>6.5</final>
39 </alumno>
40 <alumno convocatoria="Septiembre">
41 <nombre>Concepción</nombre>
42 <apellidos>Lalinde Priego</apellidos>
43 <matricula>m034093</matricula>
44 <cuestionarios>4.0</cuestionarios>
45 <tareas>3.0</tareas>
46 <examen>2.0</examen>
47 <final>3.0</final>
48 </alumno>
49 <alumno convocatoria="Junio">
50 <nombre>Esther</nombre>
51 <apellidos>Pereda</apellidos>
52 <matricula>m938762</matricula>
53 <cuestionarios>2.0</cuestionarios>
54 <tareas>3.0</tareas>
55 <examen>2.0</examen>
56 <final>2.5</final>
57 </alumno>
58 </notas>

XSL:

3 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
4 <xsl:output method="html"/>
5
6 <xsl:template match="/">
7 <html>
8 <head>
9 <title><xsl:template select="notas"/></title>
10 </head>
11 <body>
12 <h1>NOTAS</h1>
13 <h2>CONVOCATORIA DE JUNIO</h2>
14 <h3>Alumnos</h3>
15 <xsl:apply-templates select="notas/alumno"/>
16 </body>
17 </html>
18 </xsl:template>
19
20 <xsl:template match="alumno">
21 <p>
22 <table align="center" border="1">
23 <td><b>Nombre</b>
24 <p><xsl:value-of select="nombre"/></p>
25 </td>
26 <td>
27 <b>Apellidos</b>
28 <p><xsl:value-of select="apellidos"/></p>
29 </td>
30 <td><b>Tareas</b>
31 <p><xsl:value-of select="tareas"/></p>
32 </td>
33 <td><b>Cuestionarios</b>
34 <p><xsl:value-of select="cuestionarios"/></p>
35 </td>
36 <td><b>Nota Final</b>
37 <p><xsl:value-of select="final"/></p>
38 </td>
39 </table>
40 </p>
41 </xsl:template>
42
43
44 </xsl:stylesheet>

Tal como lo tengo, he conseguido mostrar en web los datos de todos los alumnos en una tabla, sin embargo, necesito filtar únicamente los de la convocatoria "Junio". Lo intento modificando la siguiente línea:

<xsl:template match="alumno[@convocatoria='Junio']">

Pero no me hace lo que quiero. ¿Donde tendría que hacer el filtro del atributo de la convocatoria?

Por otro lado, necesito mostrar las notas en letra según el intervalo de éstas (>9 (SOBRESALIENTE), >=7(NOTABLE)... etc), pero tengo la duda del código en sí, y en cual de los dos documentos debo ponerlo, si en el XML o el XSL.

A ver si me podéis orientar un poco, gracias.

PD: intento copiarlo y pegarlo con formato mediante print HTML pero no se pega el formato, lo siento.

Un saludo.
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

Filtrar datos en un XSLT y aplicar formato condicional

Publicado por Alejandro (227 intervenciones) el 07/07/2023 18:57:01
Para filtrar únicamente los alumnos de la convocatoria "Junio" en tu XSLT, necesitas realizar algunos ajustes en tu código. Aquí tienes la solución y las explicaciones correspondientes:

1. En el archivo XSLT, modifica la línea `<xsl:apply-templates select="notas/alumno"/>` a `<xsl:apply-templates select="notas/alumno[@convocatoria='Junio']"/>`. Esto filtrará solo los alumnos de la convocatoria "Junio" para su procesamiento posterior.

2. Dentro del `<xsl:template match="alumno">`, añade el filtro adicional `<xsl:if test="@convocatoria='Junio'">...</xsl:if>`. Esto asegurará que solo se aplique el formato a los alumnos de la convocatoria "Junio".

A continuación, te muestro el código XSLT modificado:

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
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html"/>
 
  <xsl:template match="/">
    <html>
      <head>
        <title>Notas Convocatoria Junio</title>
      </head>
      <body>
        <h1>NOTAS</h1>
        <h2>CONVOCATORIA DE JUNIO</h2>
        <h3>Alumnos</h3>
        <xsl:apply-templates select="notas/alumno[@convocatoria='Junio']"/>
      </body>
    </html>
  </xsl:template>
 
  <xsl:template match="alumno">
    <xsl:if test="@convocatoria='Junio'">
      <p>
        <table align="center" border="1">
          <td><b>Nombre</b>
            <p><xsl:value-of select="nombre"/></p>
          </td>
          <td>
            <b>Apellidos</b>
            <p><xsl:value-of select="apellidos"/></p>
          </td>
          <td><b>Tareas</b>
            <p><xsl:value-of select="tareas"/></p>
          </td>
          <td><b>Cuestionarios</b>
            <p><xsl:value-of select="cuestionarios"/></p>
          </td>
          <td><b>Nota Final</b>
            <p><xsl:value-of select="final"/></p>
          </td>
        </table>
      </p>
    </xsl:if>
  </xsl:template>
 
</xsl:stylesheet>

Con estos cambios, solo se mostrarán los alumnos de la convocatoria "Junio" en la tabla generada por el XSLT.

Para mostrar las notas en letra según el intervalo, puedes utilizar una estructura condicional `<xsl:choose>` dentro del `<xsl:template match="alumno">`. Aquí tienes un ejemplo de cómo puedes hacerlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<xsl:template match="alumno">
  <xsl:if test="@convocatoria='Junio'">
    <p>
      <table align="center" border="1">
        <!-- Resto de código -->
        <td><b>Nota Final</b>
          <p>
            <xsl:value-of select="final"/>
            <xsl:choose>
              <xsl:when test="final > 9.0">SOBRESALIENTE</xsl:when>
              <xsl:when test="final >= 7.0">NOTABLE</xsl:when>
              <xsl:when test="final >= 5.0">APROBADO</xsl:when>
              <xsl:otherwise>SUSPENSO</xsl:otherwise>
            </xsl:choose>
          </p>
        </td>
        <!-- Resto de código -->
      </table>
    </p>
  </xsl:if>
</xsl:template>

En este ejemplo, se utiliza la estructura `<xsl:choose>` para realizar comparaciones condicionales en función de la nota final. Dependiendo del intervalo de notas, se mostrará un mensaje correspondiente (SOBRESALIENTE, NOTABLE, APROBADO o SUSPENSO).

Espero que esta solución te sea útil y te ayude a resolver tus dudas.
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