Foros del Web » Programación para mayores de 30 ;) » Programación General »

Tratar dos archivos XML en un mismo XSL simultáneamente

Estas en el tema de Tratar dos archivos XML en un mismo XSL simultáneamente en el foro de Programación General en Foros del Web. Tengo dos archivos XML con etiquetas totalmente distintas y quiero utilizar el contenido de los dos archivos en un mismo XSL para crear una página ...
  #1 (permalink)  
Antiguo 19/03/2004, 04:35
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Pregunta Tratar dos archivos XML en un mismo XSL simultáneamente

Tengo dos archivos XML con etiquetas totalmente distintas y quiero utilizar el contenido de los dos archivos en un mismo XSL para crear una página HTML a partir de la información de los dos archivos.

Alguna idea de como hacerlo o por donde podrían ir los tiros?

Supongo que tendrá algo que ver con los namespaces, no? Algún ejemplo sencillo?

Yo propongo los archivos XML y el XSL mas o menos para facilitar que me pongais un ejemplo.


archivo1.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<libro>
<categoria id="3"/>
<capitulo orden="1">
<titulo>Introduccion</titulo>
<texto>El objetivo de este archivo es conseguir mostrar la información de este xml junto con la información de otro xml distinto en una misma página html.</texto>
</capitulo>

<capitulo orden="2">
<titulo>Éxito conseguido</titulo>
<texto>De momento no se ha conseguido ningún éxito. </texto>
</capitulo>

</libro>

archivo2.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<biblioteca>
<categoria id="1">Ciencia Ficción</categoria>
<categoria id="2">Terror</categoria>
<categoria id="3">Técnico</categoria>
</biblioteca>

archivo.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="biblioteca">
<html>
<head>
<title>Dos XML en Un XSL</title>
</head>
<body>
<for-each select="categoria">
<xsl:apply-templates select="."/>
</for-each>
</body>
</html>
</xsl:template>
<xsl:template match="categoria">
<for-each select="libro[categoria/@id = @id]">
<!-- ojo.. se está mezclando justo en este punto etiquetas de los dos archivos xml -->
<xsl:for-each select="capitulo">
<xsl:apply-templates select="."/>
</xsl:for-each>
</for-each>
</xsl:template>
<xsl:template match="capitulo">
<xsl:value-of select="titulo"/>
<br/>
<p>
<xsl:value-of select="texto"/>
</p>
</xsl:template>
</xsl:stylesheet>

Al final me quedó un poco largo pero creo que se entiende.

Un beso
  #2 (permalink)  
Antiguo 24/03/2004, 09:42
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
u_U... ya encontré una solución.

La dejo aquí puesta por si alguien la necesita.

biblioteca.xml

Código PHP:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml
-stylesheet type="text/xsl" href="2XMLin1XSL.xsl" ?>
<biblioteca>
   <categoria idCategoria="1">Ciencia Ficción</categoria>
   <categoria idCategoria="2">Terror</categoria>
   <categoria   idCategoria="3">Técnico</categoria>
</biblioteca>

libro.xml

Código PHP:
<?xml version="1.0" encoding="ISO-8859-1"?>
<libros>
   <libro idCategoria="3">
      <titulo>Mis terrores favoritos 2</titulo>
      <capitulo orden="1">
         <titulo>Introduccion 2</titulo>
         <texto>El objetivo de este archivo es conseguir mostrar la información de este xml junto con la información de otro xml distinto en una misma página html.</texto>
      </capitulo>
      <capitulo orden="2">
         <titulo>Éxito conseguido 2</titulo>
         <texto>De momento no se ha conseguido ningún éxito.  </texto>
      </capitulo>
   </libro>
   <libro idCategoria="1">
      <titulo>Mis terrores favoritos</titulo>
      <capitulo orden="1">
         <titulo>Introduccion</titulo>
         <texto>El objetivo de este archivo es conseguir mostrar la información de este xml junto con la información de otro xml distinto en una misma página html.</texto>
      </capitulo>
      <capitulo orden="2">
         <titulo>Éxito conseguido</titulo>
         <texto>De momento no se ha conseguido ningún éxito.  </texto>
      </capitulo>
   </libro>
</libros>

2XMLin1XSL.xsl

Código PHP:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="biblioteca">
      <html>
         <head>
            <title>Dos XML en Un XSL</title>
         </head>
         <body>
            <for-each select="categoria">
               <xsl:apply-templates select="categoria"/>
            </for-each>
         </body>
      </html>
   </xsl:template>
   <xsl:template match="categoria">
      <xsl:variable name="id" select="@idCategoria"/>
      <xsl:variable name="cat" select="document('libro.xml')"/>
      <xsl:for-each select="$cat/libros/libro[@idCategoria=$id]">
         <!-- ojo.. se está mezclando justo en este punto etiquetas de los dos archivos xml -->
         <p>
            <b>
               <font size="+2">
                  <xsl:apply-templates select="titulo"/>
               </font>
            </b>
         </p>
         <xsl:for-each select="capitulo">
            <xsl:sort select="orden"/>
            <xsl:apply-templates select="."/>
         </xsl:for-each>
      </xsl:for-each>
   </xsl:template>
   <xsl:template match="capitulo">
      <b>
         <xsl:value-of select="titulo"/>
      </b>
      <p>
         <xsl:value-of select="texto"/>
      </p>
   </xsl:template>
</xsl:stylesheet>
Nótese que las estructuras xml de los dos archivos han cambiado porque no me parecía que tuviera mucha lógica la que propuse inicialmente.

La llamada para verlo rular sería abrir en el navegador Internet Explorarer el archivo biblioteca.xml que ya tiene asignado la hoja de estilo XSL.

De la forma que están enlazados los 3 archivos es para ponerlos en la misma carpeta.

Un beso

Última edición por Helbira; 24/03/2004 a las 09:44
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:44.