Tag-Names als Header verwenden
kaepten
- xsl
Hallo
Ich habe eine sehr einfache XML Struktur die ich mit XSLT transformieren möchte. Mir ist nicht klar, wie ich nur den ersten Block lesen kann, um einen "Eeader" zu generieren. Der Punkt ist: Ich kenne die Tag-Names unterhalb des row-Tags nicht. ("Name" und "Vorname" ist unbekannt, können auch ganz andere Tags sein. Die Hierarchie ist aber immer dieselbe und dient zur Orientierung.)
Ausgangslage:
<data>
<row no="1">
<Name>Meier</Name>
<Vorname>Peter</Vorname>
</row>
<row no="2">
<Name>Müller</Name>
<Vorname>Hans</Vorname>
</row>
...
</data>
Das hätte ich gerne bekommen:
<table>
<tr>
<td>Name</td>
<td>Vorname</td>
</tr>
<tr>
<td>Meier</td>
<td>Peter</td>
</tr>
<tr>
<td>Müller</td>
<td>Hans</td>
</tr>
...
</table>
Vielen Dank für Tipps!
kaepten
Verlfixt, trotz Vorschau:
Ich habe eine sehr einfache XML Struktur die ich mit XSLT transformieren möchte. Mir ist nicht klar, wie ich nur den ersten Block lesen kann, um einen "Eeader" zu generieren.
Sollte "Header" heissen.
kaepten
Ich habe eine sehr einfache XML Struktur die ich mit XSLT transformieren möchte. Mir ist nicht klar, wie ich nur den ersten Block lesen kann, um einen "Eeader" zu generieren.
Formuliere zwei entsprechende Templates unter Verwendung der bedingten XPath-Syntax. Hier mal der Einstieg:
<xsl:template match="/">
<html>
<head>
<title>Tabellentest</title>
</head>
<body>
<h1>Testtabelle</h1>
<table border="1">
<xsl:apply-templates />
</table>
</body>
</html>
</xsl:template>
Und hier die entsprechenden Templates:
Template für den ersten Datensatz, das einen Tabellenkopf erzeugt:
<xsl:template match="row[@no='1']">
<thead>
<xsl:for-each select="child::*">
<th><xsl:value-of select="name()" /></th>
</xsl:for-each>
</thead>
</xsl:template>
Template für alle weiteren, das den Tabellenkörper erzeugt:
<xsl:template match="row[@no>'1']">
<tbody>
<tr>
<xsl:for-each select="child::*">
<td><xsl:value-of select="." /></td>
</xsl:for-each>
</tr>
</tbody>
</xsl:template>
Ich kenne die Tag-Names unterhalb des row-Tags nicht.
Dafür gibt es in XPath eine Funktion: name(), wie sie verwendet wird, kannst du an meinem kleinen Beispiel sehen.
Siechfred
@Siechfred
Vielen Dank für die ausführliche Beschreibung. Es funktioniert tadellos!
kaepten
Vielen Dank für die ausführliche Beschreibung. Es funktioniert tadellos!
Einen kleinen Schönheitsfehler hat es noch, aber das bekommst du sicher selber hin, wenn's dich stört: Das zweite Template fügt um die Tabellenzeile auch jedesmal ein TBODY-Elemente ein. Zwar kann eine Tabelle mehr als einen TBODY enthalten, weshalb das kein Fehler ist, aber einmal würde ja eigentlich reichen :)
Siechfred
Hi Siechfried
Meine Angaben waren ohnehin nur Exemplarisch gedacht, als Endresultat brauche ich kein HTML.
Ich hatte einfach nicht die Idee, wie ich das angehen soll. Dein Ansatz hatte auch vernachlässigt, dass ich durchaus auch die Daten und nicht nur die Tag-Names der 1 row brauche.
Wie gesagt, mit dem Ansatz hast Du mir aber genau da weitergeholfen wo ich noch Verständnisschwierigkeiten hatte. Meine Transformation macht jetzt exakt was ich brauche!
kaepten