XSL - Crear XML ordenado con XSLT y XML

 
Vista:

Crear XML ordenado con XSLT y XML

Publicado por JoseRamon91 (1 intervención) el 02/11/2014 21:34:58
Buenas, tengo un XML que es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE recursos SYSTEM "recursos.dtd">
<recursos>
<recurso>
<descripcion>Consorcio W3C</descripcion>
<tipo>
<externo url="http://www.w3c.es/"/>
</tipo>
<idioma>Inglés</idioma>
<contenido>
<General/>
</contenido>
<unidad>2</unidad>
</recurso>
<recurso>
<descripcion>Especificación HTML</descripcion>
<tipo>
<externo url="http://html.conclase.net/w3c/html401-es/cover.html"/>
</tipo>
<idioma>Castellano</idioma>
<contenido>
<HTML />
</contenido>
<version>4.01</version>
<unidad>2</unidad>
</recurso>
<recurso>
<descripcion>Enunciado práctica 3</descripcion>
<tipo>
<interno fichero="./locales/Practica3_200708.pdf"/>
</tipo>
<idioma>Castellano</idioma>
<contenido>
<PHP/>
</contenido>
<unidad>4</unidad>
</recurso>
<recurso>
<descripcion>W3C DOM</descripcion>
<tipo>
<externo url="http://www.w3.org/DOM/"/>
</tipo>
<idioma>Inglés</idioma>
<contenido>
<DOM />
</contenido>
<version>Level 3</version>
<unidad>3</unidad>
</recurso>
</recursos>

Ahora bien, tengo que crear un XSLT, que:

• Ordena ascendentemente por unidad.
• Ordena ascendentemente por contenido.
• Ordena ascendentemente por tipo.

Y lo guarde en un XML.

He creado este XSLT pero no consigo realizarlo alguien sabría como explicarme?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Metodo de salida -->
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="recursos/recurso">
&lt;recurso&gt;
&lt;descripcion&gt;<xsl:value-of select="descripcion" />&lt;/descripcion&gt;
&lt;tipo&gt;
<xsl:choose>
<xsl:when test="tipo/externo">
&lt;externo url="<xsl:value-of select="tipo/externo/@url" />" /&gt;
</xsl:when>
<xsl:otherwise>
&lt;interno fichero="<xsl:value-of select="tipo/interno/@fichero" />" /&gt;
</xsl:otherwise>
</xsl:choose>
&lt;/tipo&gt;
&lt;idioma&gt;<xsl:value-of select="idioma" />&lt;/idioma&gt;
&lt;contenido&gt;
<xsl:choose>
<xsl:when test="contenido/General">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
<xsl:when test="contenido/HTML">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
<xsl:when test="contenido/CSS">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
<xsl:when test="contenido/XML">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
<xsl:when test="contenido/JavaScript">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
<xsl:when test="contenido/DOM">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
<xsl:when test="contenido/PHP">
&lt;<xsl:value-of select="contenido/."/>/&gt;
</xsl:when>
</xsl:choose>
&lt;/contenido&gt;
<xsl:if test="version">
&lt;version&gt;<xsl:value-of select="version" />&lt;/version&gt;
</xsl:if>
&lt;unidad&gt;<xsl:value-of select="unidad" />&lt;/unidad&gt;
&lt;/recurso&gt;
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
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

Ordenamiento de recursos por unidad, contenido y tipo

Publicado por Alejandro (227 intervenciones) el 07/07/2023 16:33:18
El XSLT que has creado no incluye la lógica necesaria para ordenar los elementos según los criterios especificados. Aquí te proporciono un XSLT actualizado que cumple con los requisitos de ordenamiento ascendente por unidad, contenido y tipo:

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
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Método de salida -->
  <xsl:output method="xml" indent="yes"/>
 
  <!-- Plantilla raíz -->
  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="recursos/recurso">
        <xsl:sort select="unidad" data-type="number" order="ascending"/>
        <xsl:sort select="contenido/*" order="ascending"/>
        <xsl:sort select="tipo/*" order="ascending"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  <!-- Plantilla para cada recurso -->
  <xsl:template match="recurso">
    <xsl:copy>
      <xsl:copy-of select="descripcion"/>
      <tipo>
        <xsl:choose>
          <xsl:when test="tipo/externo">
            <externo url="{tipo/externo/@url}"/>
          </xsl:when>
          <xsl:otherwise>
            <interno fichero="{tipo/interno/@fichero}"/>
          </xsl:otherwise>
        </xsl:choose>
      </tipo>
      <xsl:copy-of select="idioma"/>
      <contenido>
        <xsl:copy-of select="contenido/*"/>
      </contenido>
      <xsl:copy-of select="version"/>
      <xsl:copy-of select="unidad"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

El XSLT realiza los siguientes pasos:

1. Define la versión del XSLT y el espacio de nombres correspondiente.
2. Establece el método de salida como XML e indentado.
3. La plantilla raíz se aplica al elemento raíz del documento XML.
4. Selecciona todos los elementos `recurso` dentro de `recursos` y los ordena ascendente según unidad, contenido y tipo.
5. Dentro de cada recurso, se copian los elementos y atributos correspondientes en el orden deseado.
6. El resultado final es un XML ordenado según los criterios especificados.

Espero que esta actualización te ayude a lograr el resultado deseado.
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