Tabelle umwandeln
hh
- xsl
0 Thomas J.S.0 hh
Hallo,
ich muss eine Umwandlung tätigen. Bevor ich aber anfange, wollte ich mal kurz um Meinung fragen, wie ihr daran gehen würdet, vielleicht hat ja schon einer sich damit beschäftigt (und das Rad wuerde nicht neu erfunden werden) zum anderen vielleicht auch einen guten Tipp fürs Vorgehen. Ich will keine Komplettlösung (versteht sich wohl ;-), aber vielleicht einen Tipp, wie man es elegant lösen koennte.
Also mir liegt eine Tabelle vor, die XHTML konform ist (ich kann sie aber auch als OpenXML darstellen, das Problem bleibt das Gleiche). In der Tabelle gibt es mehrere Überschriften, die gekennzeichnet sind mit einem 'h' in der zweiten Zelle der Tabellenreihe. Darunter liegen dann die Datenreihen mit einer Elementbezeichnung und den Werten für die jeweiligen Perioden (die Periode steht in der Überschrift in der Spalte der Wertspalte). Die Perioden sind aber nicht in jeder Überschrift gleich. Ich moechte nun mit xsl eine umwandlung, dass ich dann in der neuen XML ein Element habe, welches die Bezeichnung trägt, den Wert sowie die entsprechende Periode. Klingt kompliziert, ist aber etwas anschaulicher mit Beispiel, deshalb anbei die XHTMl Datei.
Als Ergbnis moechte ich nun alle Element ohne Überschrift beispielhaft haben:
.
<Element3 balance="credit" wert="650000" periode="20X1" currency="euro"/>
<Element3 balance="credit" wert="300000" periode="20X2" currency="dollar"/>
<Element3 balance="credit" wert="nr" periode="20X3" currency="euro"/>
.
<Element9 balance="credit" wert="350000" period="20Y1" currency="euro"/>
<Element9 balance="credit" wert="300000" period="20W2" currency="dollar"/>
.
Meine Hauptfragen wäre, mit welcher XPATH Abfrage komme ich von der aktuellen Tabellenreihe in die entsprechend übergeordnete Reihe mit der Überschrift, um mir die Periode zu besorgen, sowie den Währungstype, der auch in der Überschrift steht? Und dann muesste ich ja auch noch eine Art Schleife ziehen, um alle vorhanden Perioden abzufragen (wobei alle Perioden, die möglich sind, in einem knoten liegen unter time/periode/@periodevalue). Wie gesagt, vielleicht hat ja einer so etwas schon gemacht oder weiss einen Link hierfür.
Hier die HTML (ist aber xhml konform):
<html xmlns:fo="http://www.w3.org/1999/XSL/Format">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<table border="1">
<tr bgcolor="#EEE0FF">
<td >1</td>
<td >h</td>
<td >-</td>
<td >Bezeichnung</td>
<td >balance</td>
<td >20X1</td>
<td >test</td>
<td >euro</td>
<td >20X2</td>
<td >test</td>
<td >dollar</td>
<td >20X3</td>
<td >test</td>
<td >euro</td>
</tr>
<tr bgcolor="#A3ACFF">
<td >2</td>
<td >0</td>
<td >root</td>
<td>Element1</td>
<td >credit</td>
<td >11415000</td>
<td >11415000</td>
<td >ok</td>
<td >14090000</td>
<td >14090000</td>
<td >ok</td>
<td >nr</td>
<td >nr</td>
<td >ok</td>
</tr>
<tr bgcolor="#CEDFFB">
<td >3</td>
<td >1</td>
<td >1</td>
<td >Element2</td>
<td >credit</td>
<td >11415000</td>
<td >11415000</td>
<td >ok</td>
<td >14090000</td>
<td >14090000</td>
<td >ok</td>
<td >nr</td>
<td >nr</td>
<td >ok</td>
</tr>
<tr bgcolor="#DEECFF">
<td >4</td>
<td >2</td>
<td >1</td>
<td >Element3</td>
<td >credit</td>
<td >650000</td>
<td >650000</td>
<td >ok</td>
<td >300000</td>
<td >300000</td>
<td >ok</td>
<td >nr</td>
<td >nr</td>
<td >ok</td>
</tr>
<tr bgcolor="#EEE0FF">
<td >1</td>
<td >h</td>
<td >-</td>
<td >Bezeichnung</td>
<td >balance</td>
<td >20Y1</td>
<td >test</td>
<td >euro</td>
<td >20W2</td>
<td >test</td>
<td >dollar</td>
</tr>
<tr bgcolor="#DEECFF">
<td >4</td>
<td >2</td>
<td >1</td>
<td >Element8</td>
<td >credit</td>
<td >650000</td>
<td >650000</td>
<td >ok</td>
<td >300000</td>
<td >300000</td>
<td >ok</td>
</tr>
<tr bgcolor="#CCCCCC">
<td >5</td>
<td >3</td>
<td >1</td>
<td >Element9</td>
<td >credit</td>
<td >350000</td>
<td >350000</td>
<td >ok</td>
<td >300000</td>
<td >300000</td>
<td >ok</td>
</tr>
<tr bgcolor="#CCCCCC">
<td >6</td>
<td >3</td>
<td >2</td>
<td >Element4</td>
<td >credit</td>
<td >300000</td>
<td >300000</td>
<td >ok</td>
<td >0</td>
<td >0</td>
<td >ok</td>
</tr>
</table>
</body>
</html>
Gruß
Hallo,
Also mir liegt eine Tabelle vor, die XHTML konform ist (ich kann sie aber auch als OpenXML darstellen, das Problem bleibt das Gleiche). In der Tabelle gibt es mehrere Überschriften, die gekennzeichnet sind mit einem 'h' in der zweiten Zelle der Tabellenreihe. Darunter liegen dann die Datenreihen mit einer Elementbezeichnung und den Werten für die jeweiligen Perioden (die Periode steht in der Überschrift in der Spalte der Wertspalte). Die Perioden sind aber nicht in jeder Überschrift gleich. Ich moechte nun mit xsl eine umwandlung, dass ich dann in der neuen XML ein Element habe, welches die Bezeichnung trägt, den Wert sowie die entsprechende Periode. Klingt kompliziert, ist aber etwas anschaulicher mit Beispiel, deshalb anbei die XHTMl Datei.
Als Ergbnis moechte ich nun alle Element ohne Überschrift beispielhaft haben:
Meine Hauptfragen wäre, mit welcher XPATH Abfrage komme ich von der aktuellen Tabellenreihe in die entsprechend übergeordnete Reihe mit der Überschrift, um mir die Periode zu besorgen, sowie den Währungstype, der auch in der Überschrift steht?
So in etwa könnte ich mir das Vorstellen:
<xsl:for-each select="tr[td[2][. != 'h']]]">
<xsl:element name="{td[4]}">
<xsl:attribut name="{preceding-sibling::tr[td[2][. = 'h']]]/td[5]}">
<!-- oder <xsl:attribut name="balance"> etc. -->
<xsl:value-of select="td[5]" />
</xsl:attribute>
....
</xsl:element>
</xsl:for-each>
Und dann muesste ich ja auch noch eine Art Schleife ziehen, um alle vorhanden Perioden abzufragen (wobei alle Perioden, die möglich sind, in einem knoten liegen unter time/periode/@periodevalue). Wie gesagt, vielleicht hat ja einer so etwas schon gemacht oder weiss einen Link hierfür.
Dazu kann ich insofern nichts sagen, da ich nicht die Beduetung von "Periode" kenne. Aber du kannst innerhalb des xsl:element eine Abfrage machen und @periode nur dann erzeugen, wenn es in der Tabelle existiert.
(was eigentlich nicht schlecht wäre, denn die Tabelle ist keineswegs korrekt, wenn darin einfach Zellen fehlen.)
Grüße
Thomas
Hallo Thomas besten Danke,
werde mir deinen Vorschlag mal zu Herzen nehmen, und darauf achten, wenn ich zu dem Problem komme. Mal sehen ob ich es noch bis Freitag schaffe ;-)
(was eigentlich nicht schlecht wäre, denn die Tabelle ist keineswegs korrekt, wenn darin einfach Zellen fehlen.)
Na ja, zellen fehlen mir eigentlich nicht, nur indem beispiel von mir wollte ich zeigen, dass es nicht durchaus immer gleich viele Perioden gibt. Das ganze soll nähmlich eine retour aus openxml bzw. ods werden und da fehlen ja bekanntlich nicht zellen.
Gruß,
PS: Gibt es eigentlich eine Regel, wann man apply-templates bzw. call-templates verwenden sollte? Ich verwende immer in meinen Stylesheets call-template aufrufe, um die Sachen etwas zu sortieren und weiss nicht, wann es besser waere ein apply template zu nutzen, gibt es da eine Regel? Denn eigentlich kann man doch alles mit call-template darstellen?