Cita:
Iniciado por NemesisFF
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.