Tabelle in xsl
Jan
- xsl
0 dey0 Thomas J.S.0 Jan
Ich habe folgendes Problem:
Ich möchte in XSL eine Tabelle erstellen, die eine variable Anzahl Zeilen und Spalten besitzt. Die Anzahl für Zeilen und Spalten werden aus dem darzustellende xml-file ausgelesen. Da ich nun schon längere Zeit über diesem Problem grübel und leider zu keiner lauffähigen Lösung gekommen bin, wäre es schön, wenn mir Jemand helfen könnte.
Gruss
Jan
Servus
kleines Rahmenkonstruct
<table border="1"><tr>
<xsl:apply-templates select="xmlkurs/kursmitglied"/></tr>
</table></body>
</html>
</xsl:template>
<xsl:template match="kursmitglied/person">
<td><xsl:value-of select="vorname"/></td>
</xsl:template>
<xsl:template match="kursmitglied/kurs">
<td><xsl:value-of select="bezeichnung"/></td>
</xsl:template>
bydey
Hallo,
Ich habe folgendes Problem:
Wie sieht dein XML aus und was ist umgefähr die Ausgabe die du erwartest?
Grüße
Thomas
Hallo,
Ich habe folgendes Problem:
Wie sieht dein XML aus und was ist umgefähr die Ausgabe die du erwartest?
Grüße Thomas
Mein xml sieht folgendermaßen aus, wobei die Tabelle natürlich noch größer sein kann. Die Tabelle bzw. das xml-file wird entsprechend der vorgegebenen Zeilen-Spaltenanzahl generiert (hier jedoch nicht das Problem). Meine xsl-Versuche diesbezüglich habe ich Dir auch noch dazu kopiert (bisher leider fehlerhaft). Die Ausgabe soll lediglich die Elemente entsprechend ihren Bezeichnungen im xml-file (müsste eigentlich selbsterklärend sein) in einer Tabelle darstellen. Bei fester Anzahl Zeilen und Spalten würde ich dies auch ohne weiteres hinbekommen. Aber so gestaltet es sich etwas schwierig:
xsl: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <html> <head> <title/> </head> <!-- Einbinden der pi_intranet.css --> <link rel="stylesheet" href="css/style.css" type="text/css" /> <body> <!-- Darstellung der Seitenstruktur --> <xsl:if test="page/show_table = 'true'"> <xsl:apply-templates select="page/table_headline"/> <br /> <xsl:apply-templates select="page/table" /> </xsl:if> </body> </html> </xsl:template>
<!-- Definition der einzelnen Schablonen -->
<!-- Definition der table_headline --> <xsl:template match="table_headline"> <p> <xsl:value-of select="." /> </p> </xsl:template>
<!-- Versuch einer Schleifen-Konstruktion -->
<xsl:template match="table">
<table width="100%" border="1"> <tr> <xsl:call-template name="column_headlines"> <xsl:with-param name="counter1" select="1" /> </xsl:call-template> </tr> <xsl:call-template name="table_construct"> <xsl:with-param name="counter2" select="3" /> </xsl:call-template> </table>
</xsl:template>
<!-- Template, um die Spaltenüberschriften zu definieren --> <xsl:template name="column_headlines"> <xsl:param name="counter1" /> xsl:choose <xsl:when test="$counter1 <= number(../table_columns)"> <td> <xsl:attribute name="align"> <xsl:value-of select="tr[1]/td[$counter1]/column_format" /> </xsl:attribute> <xsl:value-of select="tr[2]/td[$counter1]/table_header"/> </td> <xsl:call-template name="column_headlines"> <xsl:with-param name="counter1" select="$counter1 + 1" /> </xsl:call-template> </xsl:when> xsl:otherwise <xsl:call-template name="Abbruch1" /> </xsl:otherwise> </xsl:choose> </xsl:template>
<!-- Template, um den Tabellenaufbau in Abhängigkeit von der vorgegebenen Zeilenanzahl zu definieren --> <xsl:template name="table_construct"> <xsl:param name="counter2" /> xsl:choose <xsl:when test="$counter2 < (number(../table_rows) + 3)"> <tr> <xsl:call-template name="construct_cols"> <xsl:with-param name="counter2" select="$counter2" /> <xsl:with-param name="counter3" select="1" /> </xsl:call-template> </tr> <xsl:call-template name="table_construct"> <xsl:with-param name="counter2" select="$counter2 + 1" /> </xsl:call-template> </xsl:when> xsl:otherwise <xsl:call-template name="Abbruch2" /> </xsl:otherwise> </xsl:choose> </xsl:template>
<xsl:template name="construct_cols"> <xsl:param name="counter3" /> <xsl:param name="counter2" /> xsl:choose <xsl:when test="$counter3 < number(../table_cols)"> <td> <xsl:attribute name="align"> <xsl:value-of select="tr[1]/td[$counter3]/column_format" /> </xsl:attribute> <xsl:value-of select="tr[$counter2]/td[$counter3]/table_element"/> </td> <xsl:call-template name="construct_cols"> <xsl:with-param name="counter3" select="$counter3 + 1" /> <xsl:with-param name="counter2" select="$counter2" /> </xsl:call-template> </xsl:when> xsl:otherwise <xsl:call-template name="table_construct"> <xsl:with-param name="counter2" select="$counter2 + 1" /> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>
<xsl:template name="Abbruch1"> xsl:commentSchleife 1 beendet!</xsl:comment> </xsl:template>
<xsl:template name="Abbruch2"> xsl:commentSchleife 2 beendet!</xsl:comment> </xsl:template>
</xsl:stylesheet>
Hallo,
» Meine xsl-Versuche diesbezüglich habe ich Dir auch noch dazu kopiert (bisher leider fehlerhaft). Die Ausgabe soll lediglich die Elemente entsprechend ihren Bezeichnungen im xml-file (müsste eigentlich selbsterklärend sein) in einer Tabelle darstellen. Bei fester Anzahl Zeilen und Spalten würde ich dies auch ohne weiteres hinbekommen. Aber so gestaltet es sich etwas schwierig:
So schwierig ist es nicht, man braucht nicht unbedingt an was kompliziertes denken:
Grüße
Thomas
-------------------------------------------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="ausrichtung" select="//column_format" />
<xsl:template match="/page">
<html>
<head>
<title/>
</head>
<body>
<xsl:if test="show_table = 'true'">
<xsl:apply-templates select="table"/>
</xsl:if>
</body>
</html>
</xsl:template>
<xsl:template match="table">
<table width="100%" border="1">
<caption><xsl:value-of select="../table_headline" /></caption>
<xsl:apply-templates select="tr[position() != 1]"/>
</table>
</xsl:template>
<xsl:template match="tr">
<tr>
<xsl:apply-templates select="td"/>
</tr>
</xsl:template>
<xsl:template match="td">
<xsl:variable name="pos1" select="position()" />
xsl:choose
<xsl:when test="./table_header">
<th>
<xsl:attribute name="align">
<xsl:value-of select="$ausrichtung[position() = $pos1]" />
</xsl:attribute>
<xsl:value-of select="child::node()/text()" />
</th>
</xsl:when>
xsl:otherwise
<td>
<xsl:attribute name="align">
<xsl:value-of select="$ausrichtung[position() = $pos1]" />
</xsl:attribute>
<xsl:value-of select="child::node()/text()" />
</td>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>