XSL - Ordenación múltiple

 
Vista:

Ordenación múltiple

Publicado por dallas89 (1 intervención) el 27/08/2011 19:12:11
Hola,

Me gustaría hacer una ordenación de una lista de "miembros" por 3 claves: "Prioridad" , "Nombre" y "Apellidos" , pero antes deben de estar agrupados por 3 categorías: "D" (doctores) , "ND" (no doctores) y "B" (becarios) en ese orden.
He probado 1000 formas de solicionarlo, he visto un montón de manuales, tutoriales y demás y NADA que solucione esto, nada que funcione.
Es un trabajo para una asignatura y los archivos "miembros.dtd" y "miembros.xml" no se pueden cambiar, solo el "miembros.xsl"


Miembros.dtd

<code><?xml version="1.0" encoding="utf-8" ?>

<! ELEMENT miembros (miembro+)>
<! ELEMENT miembro (foto?, nombre, apellidos, cargo*, correo)>
<! ELEMENT foto (#PCDATA)>
<! ELEMENT nombre (#PCDATA)>
<! ELEMENT apellidos (#PCDATA)>
<! ELEMENT cargo (#PCDATA)>
<! ELEMENT correo (#PCDATA)>
<! ATTLIST miembro sexo (V | M) (#IMPLIED)
categoria (D | ND | B) "ND" (#IMPLIED)
prioridad CDATA "0" (#IMPLIED)>
<config>Windows XP / Safari 535.1</config></code>

miembros.xml

<code>?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="miembros.xsl" type="text/xsl"?>
<!DOCTYPE miembros SYSTEM "miembros.dtd">

<miembros>
<miembro>
<nombre>Mercedes</nombre>
<apellidos>Buiz Carreira</apellidos>
<cargo>Responsable del grupo</cargo>
<cargo>Responsable de la linea "mejora del proceso software"</cargo>
<correo>[email protected]</correo>
<sexo>"M"</sexo>
<categoria>"D"</categoria>
<prioridad>"0"</prioridad>
</miembro>

<miembro>
<nombre>Inmaculada</nombre>
<apellidos>Medina Bulo</apellidos>
<cargo>Responsable de la linea "métodos formales"</cargo>
<correo>[email protected]</correo>
<sexo>"M"</sexo>
<categoria>"D"</categoria>
<prioridad>"0"</prioridad>
</miembro>
<miembro>
<nombre>José Antonio</nombre>
<apellidos>Jiménez Millán</apellidos>
<correo>[email protected]</correo>
<sexo>"V"</sexo>
<categoria>"D"</categoria>
<prioridad>"0"</prioridad>
</miembro>
<miembro>
<nombre>Juan José</nombre>
<apellidos>Domínguez Jiménez</apellidos>
<correo>[email protected]</correo>
<categoria>"ND"</categoria>
<prioridad>"0"</prioridad>
</miembro>
<miembro>
<nombre>Pedro</nombre>
<apellidos>Rodriguez García</apellidos>
<correo>[email protected]</correo>
<categoria>"ND"</categoria>
<prioridad>"0"</prioridad>
</miembro>
<miembro>
<nombre>Gregorio</nombre>
<apellidos>Cruz Rendón</apellidos>
<correo>[email protected]</correo>
<categoria>"B"</categoria>
<prioridad>"0"</prioridad>
</miembro>
<miembro>
<nombre>Ana</nombre>
<apellidos>Muñoz Rodero</apellidos>
<correo>ana.muñ[email protected]</correo>
<categoria>"B"</categoria>
<prioridad>"0"</prioridad>
</miembro>
<miembro>
<nombre>Mercedes</nombre>
<apellidos>Ruiz Carreira</apellidos>
<cargo>Responsable del grupo</cargo>
<cargo>Responsable de la linea "mejora del proceso software"</cargo>
<correo>[email protected]</correo>
<sexo>"M"</sexo>
<categoria>"D"</categoria>
<prioridad>"1"</prioridad>
</miembro>
</miembros> </code>

Miembros.xsl

<code>--> aquí va la cabecera, que tiene una URL <--
<xsl:output method="html" version="4.01" encoding="utf-8" doctype-public="-//W3C//DTD HTML 4.01//EN"/>
<xsl:template match="miembros">
<html>
<head>
<title>Generado con miembros.xsl</title>
<link href="general.css" rel="stylesheet" type="text/css"/>
<link href="miembros.css" rel="stylesheet" type="text/css" title="miembros"/>
</head>
<body>
<xsl:apply-templates>
<xsl:for-each select="categoria='D'">
<xsl:sort select="prioridad" order="descending" data-type="text"/>
<xsl:sort select="nombre" order="ascending" data-type="text"/>
<xsl:sort select="apellidos" order="ascending" data-type="text"/>
</xsl:for-each>
<xsl:for-each select="categoria='ND'">
<xsl:sort select="prioridad" order="descending" data-type="text"/>
<xsl:sort select="nombre" order="ascending" data-type="text"/>
<xsl:sort select="apellidos" order="ascending" data-type="text"/>
</xsl:for-each>
<xsl:for-each select="categoria='B'">
<xsl:sort select="prioridad" order="descending" data-type="text"/>
<xsl:sort select="nombre" order="ascending" data-type="text"/>
<xsl:sort select="apellidos" order="ascending" data-type="text"/>
</xsl:for-each>
</xsl:apply-templates>

</body>
</html>
</xsl:template>
</xsl:stylesheet> </code>
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

Ordenación y agrupación de miembros por categoría y claves

Publicado por Alejandro (227 intervenciones) el 07/07/2023 00:38:50
El problema que estás enfrentando en tu archivo XSL radica en el uso incorrecto de los elementos `<xsl:for-each>` y `<xsl:sort>`. Además, la estructura de agrupación por categoría no se está aplicando correctamente. Aquí tienes una solución corregida para tu archivo "miembros.xsl":

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
<?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-public="-//W3C//DTD HTML 4.01//EN"/>
 
  <xsl:template match="miembros">
    <html>
      <head>
        <title>Generado con miembros.xsl</title>
        <link href="general.css" rel="stylesheet" type="text/css"/>
        <link href="miembros.css" rel="stylesheet" type="text/css" title="miembros"/>
      </head>
      <body>
        <xsl:apply-templates select="miembro[categoria='D']">
          <xsl:sort select="prioridad" order="descending" data-type="text"/>
          <xsl:sort select="nombre" order="ascending" data-type="text"/>
          <xsl:sort select="apellidos" order="ascending" data-type="text"/>
        </xsl:apply-templates>
 
        <xsl:apply-templates select="miembro[categoria='ND']">
          <xsl:sort select="prioridad" order="descending" data-type="text"/>
          <xsl:sort select="nombre" order="ascending" data-type="text"/>
          <xsl:sort select="apellidos" order="ascending" data-type="text"/>
        </xsl:apply-templates>
 
        <xsl:apply-templates select="miembro[categoria='B']">
          <xsl:sort select="prioridad" order="descending" data-type="text"/>
          <xsl:sort select="nombre" order="ascending" data-type="text"/>
          <xsl:sort select="apellidos" order="ascending" data-type="text"/>
        </xsl:apply-templates>
      </body>
    </html>
  </xsl:template>
 
  <xsl:template match="miembro">
    <!-- Aquí va el código para mostrar la información de cada miembro -->
  </xsl:template>
</xsl:stylesheet>

En este código corregido, los elementos `<xsl:for-each>` y `<xsl:sort>` se han movido al lugar adecuado dentro del elemento `<xsl:apply-templates>`. Además, se ha aplicado correctamente la condición de filtrado para cada categoría.

Dentro del template `<xsl:template match="miembro">`, puedes agregar el código necesario para mostrar la información de cada miembro de acuerdo con tus requerimientos.

Recuerda que este código solo aborda la estructura de ordenación y agrupación de los miembros. Debes completar el código para mostrar la información deseada de cada miembro en el lugar correspondiente dentro de la plantilla `<xsl:template match="miembro">`.
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