Tema: XML archivos
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/06/2008, 19:23
mhatter
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 17 años, 6 meses
Puntos: 2
Respuesta: ayuda urgente!!! XML archivos

Cita:
Iniciado por NemesisFF Ver Mensaje
Mi duda es como hacer el XSL y hacer q los atributos q tienen en comun los XML se relacionen.
Puede hacerse de muchas maneras, pero los detalles dependen de qué es lo que exactamente necesitas.

Si estás empezando con XSLT y aun no conoces muy bien la forma en que se escriben las plantillas XSL, te recomiendo que te tomes el tiempo para buscar y leer información sobre estos temas, me parece que vale mucho la pena.

Bueno, como no das más detalles sobre tu problema, voy a asumir que quieres hacer algo como presentar una lista de las asignaturas en tu HTML, y que para cada asignatura aparezca p.ej. la lista de alumnos asociados con esa asignatura.

Por el modo en que tienes organizada la información (con dos archivos: alumno.xml y asignaturas.xml), algunos elementos clave en tu XSL serían:
  • Cargar los datos XML del segundo archivo con la función document(). En este caso, como asignaturas.xml tiene una directiva <?xml-stylesheet?> vamos a asumir que quieres escribir salida.xsl, que está asociada con asignaturas.xml, y por lo tanto necesitas cargar el archivo alumno.xml desde esa plantilla.

    En este caso, la forma de asociar una variable con tu archivo externo sería algo como:
    Código:
    <xsl:variable name="alumnos" select="document('alumno.xml')" />
    
  • Escribir una plantilla en donde cada elemento <asignatura> de asignaturas.xml sea procesado.
  • Para cada asignatura, hay que recuperar la lista de elementos <alumno> en alumno.xml que estén asociados con la asignatura actual. Para esto, primero vamos a tomar el atributo 'codigo' de cada asignatura y almacenarlo en una variable. Esto se vería algo así:
    Código:
    <xsl:variable name="cod" select="@codigo" />
    
  • Finalmente se buscan elementos bajo el árbol XML almacenado en la variable $alumnos, y que contengan asignaturas que coincidan con el código correspondiente que almacenamos en $cod. Esto podría hacerse de esta forma:
    Código:
    <xsl:for-each select="$alumnos/alumnos/alumno[asignaturas/asignatura/@codigo=$cod]">
      <!-- Aqui se imprime la informacion de cada 'alumno' -->
    </xsl:for-each>
    

El código de salida.xsl en su totalidad sería entonces algo así:

Código:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <xsl:variable name="alumnos" select="document('alumno.xml')" />

  <xsl:template match="/asignaturas">
    <html>
      <head>
        <title>Ejemplo de relaciones en XML</title>
      </head>
      <body>

        <h1>Asignaturas</h1>

        <xsl:apply-templates select="asignatura" />

      </body>
    </html>
  </xsl:template>

  <xsl:template match="asignatura">

    <p>Nombre: <strong><xsl:value-of select="nombre" /></strong></p>
    <p>Alumnos:</p>


    <ul>
      <xsl:variable name="cod" select="@codigo" />

      <xsl:for-each select="$alumnos/alumnos/alumno[asignaturas/asignatura/@codigo=$cod]">
        <li>
          <xsl:value-of select="nombre" />
          <xsl:text> </xsl:text>
          <xsl:value-of select="apellido1" />
          <xsl:text> </xsl:text>
          <xsl:value-of select="apellido2" />
        </li>
      </xsl:for-each>
    </ul>

    <hr />
  </xsl:template>

</xsl:stylesheet>
Espero que con esto puedas hacerte una idea de cómo es el proceso y puedas refinarlo de acuerdo a tus necesidades.