Tabellenattribute auslesen
Joy
- xsl
0 Thomas J.S.0 joy0 Joy0 Thomas J.S.0 Joy0 Thomas J.S.0 Joy0 Joy0 Thomas J.S.0 Joy
0 Thomas J.S.
Hallo,
ich bins mal wieder mit einem neuen Problem :-)
Da mir bisher hier immer super geholfen wurde, möchte ich es gerne wieder versuchen.
Ich habe ein XML File mit einer Tabelle. Um die Tabelle mit einem XSLT in eine HTML Tabelle zu verwandeln, benutze ich CDATA. Desweiteren sollen aber auch die Attribute der Tabelle und ihrer Spalten an den jeweiligen Stellen mit übergeben werden. Soweit so gut, nur das ich beim auslesen der Attribute der Spalten immer alle Attribute (für alle Spalten einer Tabelle) bekomme und nicht für die einzelne Spalte.
Kann mir da vielleicht bitte wieder jemand helfen?
Hier mein XML Code:
<xhtml:div >
<xhtml:table class="dataTableStyle msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 895px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" borderColor="#c0c0c0" cellPadding="0" width="100%" border="1">
xhtml:colgroup
<xhtml:col style="WIDTH: 179px"/><xhtml:col style="WIDTH: 269px"/><xhtml:col style="WIDTH: 179px"/><xhtml:col style="WIDTH: 268px"/>
</xhtml:colgroup>
xhtml:tbody
xhtml:tr
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:div </xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div<xhtml:span nowrap="1"/> </xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:divxhtml:strongZeile 1Spalte3</xhtml:strong>
</xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div </xhtml:div></xhtml:td>
</xhtml:tr>
xhtml:tr
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:divxhtml:strongZeile2Spalte1</xhtml:strong>
</xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div<xhtml:span nowrap="1"/> </xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:divxhtml:strongZeil2Spalte3</xhtml:strong>
</xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div </xhtml:div></xhtml:td>
</xhtml:tr>
</xhtml:tbody>
</xhtml:table>
</xhtml:div>xhtml:div
<xhtml:table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 896px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
xhtml:colgroup<xhtml:col style="WIDTH: 896px"/></xhtml:colgroup>
xhtml:tbody
xhtml:tr
<xhtml:td style="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none">
xhtml:div
<xhtml:table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 894px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
xhtml:colgroup<xhtml:col style="WIDTH: 136px"/><xhtml:col style="WIDTH: 758px"/></xhtml:colgroup>
xhtml:tbody
xhtml:tr
<xhtml:td bgColor="#006400"><xhtml:font color="#ffffff">xhtml:strongneue TabelleZeile1Spalte1</xhtml:strong></xhtml:font></xhtml:td>
<xhtml:td bgColor="#006400"><xhtml:font color="#ffffff">xhtml:strongneue Tabelle Zeile1Spalte2</xhtml:strong></xhtml:font></xhtml:td>
</xhtml:tr>
</xhtml:tbody>
</xhtml:table>
</xhtml:div>
</xhtml:td>
</xhtml:tr>
</xhtml:tbody>
</xhtml:table>
</xhtml:div>
Und mein XSLT Code
<xsl:template match="xhtml:div[xhtml:table]">
<xsl:variable name="tablestring">
<xsl:for-each select="xhtml:table/@*">
<xsl:value-of select='name()' />="<xsl:value-of select='.' />"
</xsl:for-each>
</xsl:variable>
<html>
<![CDATA[<table ]]>
<xsl:value-of select="$tablestring"/>
<![CDATA[> ]]>
<xsl:apply-templates mode="body"/>
<![CDATA[</table>]]><![CDATA[ <br/> ]]>
</html>
</xsl:template>
<xsl:template match="*" mode="body">
<![CDATA[<tbody> ]]><xsl:apply-templates mode="Zeile"/><![CDATA[</tbody> ]]>
</xsl:template>
<xsl:template match="*" mode="Zeile" >
<xsl:for-each select="./xhtml:tr">
<![CDATA[<tr> ]]><xsl:apply-templates mode="Spalte"/><![CDATA[</tr> ]]>
</xsl:for-each>
</xsl:template>
<xsl:template match="*" mode="Spalte" >
<xsl:variable name="columnstring">
<xsl:for-each select="../xhtml:td/@*">
<xsl:value-of select='name()' />="<xsl:value-of select='.' />"
</xsl:for-each>
</xsl:variable>
<![CDATA[<td ]]>
<xsl:value-of select="$columnstring" />
<![CDATA[> ]]>
xsl:choose
<xsl:when test="count(./xhtml:div/xhtml:table) = 1">
<xsl:apply-templates select="*[xhtml:table]"></xsl:apply-templates>
</xsl:when>
xsl:otherwise
<xsl:value-of select="xhtml:td/@*"/><xsl:copy-of select="*"/>
</xsl:otherwise>
</xsl:choose>
<![CDATA[</td> ]]>
</xsl:template>
Vielleicht kann man den XSLT Code auch wieder vereinfachen (ich glaube ich denke manchmal etwas zu kompliziert)
gruß
Joy
Hallo,
Um die Tabelle mit einem XSLT in eine HTML Tabelle zu verwandeln, benutze ich CDATA.
Warum das?
Und mein XSLT Code
<xsl:template match="xhtml:div[xhtml:table]">
<xsl:variable name="tablestring">
<xsl:for-each select="xhtml:table/@*">
<xsl:value-of select='name()' />="<xsl:value-of select='.' />"
Hier wäre statt die value-ofs ein <xsl:copy-of select"." /> einfacher
</xsl:for-each>
</xsl:variable>
<html>
Entweder gibt es in dem XML nur ein xhtml:div als Root-Element und nur eine xhtml:table (was definitiv nicht der fall ist) oder du erzeugst für jede Tabelle ein <html> Element, was im Enddokument eigentlich nicht so gut ist[tm].
<![CDATA[<table ]]>
<xsl:value-of select="$tablestring"/>
<![CDATA[> ]]>
Ah du heiliger Bimbam! ;-) Was machst du denn da?
<xsl:template match="*" mode="body">
<xsl:template match="*" mode="Zeile" >
<xsl:template match="*" mode="Spalte" >
Du weisst schon, dass du hiermit immer für alle Elemente im Dokument diese Templates definiert, ganz egal was sie sind und wo sie stehen?
Schon das <xsl:apply-templates mode="body"/> wird eine Ausgabe erzeugen, dass jenseits von gut unud böse ist.
Vielleicht kann man den XSLT Code auch wieder vereinfachen (ich glaube ich denke manchmal etwas zu kompliziert)
Ich weiss nicht genu was du erreichen möchtest, aber wenn du nur die Tabellen in HTML (ohne den Namesraumprfix) in der Ausgabe haben willst:
------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xhtml" version="1.0">
<xsl:template match="data">
<html>
<head>
<title />
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="xhtml:div">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="xhtml:div[xhtml:table]">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="xhtml:table | xhtml:table//*[(namespace-uri(.) = 'http://www.w3.org/1999/xhtml') and (not(local-name(.) = 'div'))]">
<xsl:element name="{local-name(.)}">
<xsl:for-each select="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
----------------------------------------
<data> habe ich jetzt für mein Test als Root-Element für das XML genommen.
<data xmlns:xhtml="http://www.w3.org/1999/xhtml">
xhtml:div
...
Die Ausgabe der Transformation ist:
-------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body>
<table class="dataTableStyle msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 895px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" borderColor="#c0c0c0" cellPadding="0" width="100%" border="1">
<colgroup>
<col style="WIDTH: 179px">
<col style="WIDTH: 269px">
<col style="WIDTH: 179px">
<col style="WIDTH: 268px">
</colgroup>
<tbody>
<tr>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div> </div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div><span nowrap="1"></span>
</div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div><strong>Zeile 1Spalte3</strong>
</div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div> </div>
</td>
</tr>
<tr>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div><strong>Zeile2Spalte1</strong>
</div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div><span nowrap="1"></span>
</div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div><strong>Zeil2Spalte3</strong>
</div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div> </div>
</td>
</tr>
</tbody>
</table>
<table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 896px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
<colgroup>
<col style="WIDTH: 896px">
</colgroup>
<tbody>
<tr>
<td style="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none">
<table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 894px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
<colgroup>
<col style="WIDTH: 136px">
<col style="WIDTH: 758px">
</colgroup>
<tbody>
<tr>
<td bgColor="#006400"><font color="#ffffff"><strong>neue TabelleZeile1Spalte1</strong></font></td>
<td bgColor="#006400"><font color="#ffffff"><strong>neue Tabelle Zeile1Spalte2</strong></font></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>
------------------------------------
Grüße
Thomas
Hallo,
Um die Tabelle mit einem XSLT in eine HTML Tabelle zu verwandeln, benutze ich CDATA.
Warum das?
Ich verwende DeltaXML mit dem ich zwei XML Files vergleichen möchte. Dazu habe ich mir mehrere Filter geschrieben, welche die Files zusätzlich noch bearbeiten. Am Ende kommt nochmal ein Stylesheet über das letzte XML File (also Vergleich + Filter) und damit das Stylesheet die Tabelle auch zeichnet muss es eine HTML Tabelle sein und bisher hat das letzte Stylesheet meine HTML Tags nur gelesen wenn sie als CData vorher angegeben wurden.
<![CDATA[<table ]]>
<xsl:value-of select="$tablestring"/>
<![CDATA[> ]]>Ah du heiliger Bimbam! ;-) Was machst du denn da?
Hier wollte ich die Attribute mit in die CData Tags mit reinschreiben, also habe ich sie vorher in einen String ausgelesen.
Ich weiss nicht genu was du erreichen möchtest, aber wenn du nur die Tabellen in HTML (ohne den Namesraumprfix) in der Ausgabe haben willst:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xhtml" version="1.0">
bei mir ist handelt es sich um ein xsl:transform Stylesheet
<xsl:template match="data">
<html>
<head>
<title />
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
Wenn ich das mit drin lasse, kommt immer eine Fehlermeldung (ich habe data natürlich mit meinem RootElement ersetzt):
Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.
--------------------------------------------------------------------------------
Ungültig auf der obersten Ebene im Dokument. Fehler beim Bearbeiten der Ressource '...
com.deltaxml.core.FilterConfigurationException: Problem constructing output filter template from File: ...
Meine Ausgabe mit deiner Transformation ist sonst ok, aber wenn ich dann noch mein letztes Stylesheet drüberlege verschwinden meine table Tags sowie deren Kindknoten und nur ihr Inhalt (also das was in den Spalten drin stehen soll) ist noch da. Deswegen wollte ich ja CData verwenden.
Das Problem ist wahrscheinlich das mein letztes Stylesheet selbst auch eine Tabellenstruktur enthält und ein xhtml File ausgibt, während bisher immer xml Files als output angegeben waren.
Gruß
joy
Hallo,
also ich habe es jetzt ohne Fehlermeldung zum Laufen gebracht (es hatte noch einen Namensraumangabe gefehlt), jetzt zeigt es mir auhc den XML Inhalt als HTML an. Ich hätte aber gerne das es nur die Tabelle in HTML Code packt und der Rest XML bleibt. Ist das irgendwie möglich?
Gruß
Joy
Hallo,
jetzt zeigt es mir auhc den XML Inhalt als HTML an.
Dir ja, ich sehe davon natürlich nichts. Beschreibe bitte genauer was du meinst.
Ich hätte aber gerne das es nur die Tabelle in HTML Code packt und der Rest XML bleibt. Ist das irgendwie möglich?
Kann ich ledier nicht sagen, ich weiss nicht was in deinem XSL jetzt passiert.
Grüße
Thomas
Hi,
also mein XML sieht ungefähr so aus:
--------------XML File -------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<data xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" xmlns:html="http://www.w3.org/TR/xhtml1/strict" xmlns:xhtml="http://www.w3.org/1999/xhtml" >
<meineForm>
<meineTabelle>
<div xmlns="http://www.w3.org/1999/xhtml">
<xhtml:div >
<xhtml:table class="dataTableStyle msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 895px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" borderColor="#c0c0c0" cellPadding="0" width="100%" border="1">
xhtml:tbody
xhtml:tr
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:div </xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div<xhtml:span nowrap="1"/> </xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:divxhtml:strongZeile 1Spalte3</xhtml:strong>
</xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div </xhtml:div></xhtml:td>
</xhtml:tr>
xhtml:tr
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:divxhtml:strongZeile2Spalte1</xhtml:strong>
</xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div<xhtml:span nowrap="1"/> </xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">xhtml:divxhtml:strongZeil2Spalte3</xhtml:strong>
</xhtml:div></xhtml:td>
<xhtml:td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">xhtml:div </xhtml:div></xhtml:td>
</xhtml:tr>
</xhtml:tbody>
</xhtml:table>
</xhtml:div>xhtml:div
<xhtml:table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 896px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
xhtml:tbody
xhtml:tr
<xhtml:td style="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none">
xhtml:div
<xhtml:table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 894px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
xhtml:tbody
xhtml:tr
<xhtml:td bgColor="#006400"><xhtml:font color="#ffffff">xhtml:strongneue TabelleZeile1Spalte1</xhtml:strong></xhtml:font></xhtml:td>
<xhtml:td bgColor="#006400"><xhtml:font color="#ffffff">xhtml:strongneue Tabelle Zeile1Spalte2</xhtml:strong></xhtml:font></xhtml:td>
</xhtml:tr>
</xhtml:tbody>
</xhtml:table>
</xhtml:div>
</xhtml:td>
</xhtml:tr>
</xhtml:tbody>
</xhtml:table>
</xhtml:div>
</meineTabelle>
<meineListe>Hier kommt eine Liste
<xhtml:div xmlns="http://www.w3.org/1999/xhtml">xhtml:ulxhtml:liText</xhtml:li><xhtml:li >Text2 xhtml:br/ aber</xhtml:li><xhtml:li >Text3</xhtml:li></xhtml:ul></xhtml:div></meineListe>
</meineForm>
</data>
mein xsl sieht nun so aus:
----------------------XSL File--------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" >
<xsl:template match="data">
<html>
<head>
<title />
</head>
<body>
xsl:copy
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</body>
</html>
</xsl:template>
<xsl:template match="xhtml:div">
<div>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="xhtml:div[xhtml:table]">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="xhtml:table | xhtml:table//*[(namespace-uri(.) = 'http://www.w3.org/1999/xhtml') and (not(local-name(.) = 'div'))]">
<xsl:element name="{local-name(.)}">
<xsl:for-each select="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:transform>
und als Ausgabe bekomme ich das:
-------------------HTML AUSGABE------------------------------------
<html xmlns:xhtml="http://www.w3.org/1999/xhtml">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<data xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" deltaxml:delta="WFmodify" xml:lang="en-us">
<table class="dataTableStyle msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 895px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" borderColor="#c0c0c0" cellPadding="0" width="100%" border="1">
<tbody>
<tr>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div> </div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div><span nowrap="1"></span></div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div><strong>Zeile1Spalte3</strong></div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div> </div>
</td>
</tr>
<tr>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div><strong>Zeile2Spalte1</strong></div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div><span nowrap="1"></span></div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div><strong>Zeile2Spalte3</strong></div>
</td>
<td style="FONT-SIZE: 11px" class="readonlyGroupLabelStyle">
<div> </div>
</td>
</tr>
</tbody>
</table>
<table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 896px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
<tbody>
<tr>
<td style="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none">
<table class="msoUcTable" style="TABLE-LAYOUT: fixed; WIDTH: 894px; BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word; BORDER-BOTTOM-STYLE: none" tabIndex="-1" cellPadding="0" width="100%" border="1">
<tbody>
<tr>
<td bgColor="#006400"><font color="#ffffff"><strong>neueTabelleZeile1Spalte1</strong></font></td>
<td bgColor="#006400"><font color="#ffffff"><strong>neueTabelleZeile1Spalte2</strong></font></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<div> </div>Hier kommt eine Liste
<div>TextText2 <br/> aber <ins>Text3</ins> </div>
</data>
</body>
</html>
und wenn ich dann noch mein anderes Stylesheet drüber lege dann
zeigt er nichts mehr an, da keine Strukturelemente mehr enthalten sind.
Gruß
Joy
Hallo,
und als Ausgabe bekomme ich das:
-------------------HTML AUSGABE------------------------------------
<html xmlns:xhtml="http://www.w3.org/1999/xhtml">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<data xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" deltaxml:delta="WFmodify" xml:lang="en-us">
...
</data>
</body>
</html>
Das ist genau die Ausgabe die das XSLT erzeugen sollte.
Ich hätte aber gerne das es nur die Tabelle in HTML Code packt und der Rest XML bleibt. Ist das irgendwie möglich?
Meinst du damit, dass du <meineForm> und <meineTabelle> auch erhalten willst?
Dann muss du natürlich auch für sie ein Template schreiben.
Das xsl:copy bezieht ja nur auf das <data>-Element.
Also z.B.:
<xsl:template match="meineForm | meineTabelle">
xsl:copy
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
und wenn ich dann noch mein anderes Stylesheet drüber lege dann
zeigt er nichts mehr an, da keine Strukturelemente mehr enthalten sind.
*schmunzel* das ist es wieder: "anderes Stylesheet" und "Strukturelemente" das sind Sachen von der ich hier natürlich nichts wissen kann.
Was sind die "Strukturelemente" ? (meineForm, meineTabelle)?
Grüße
Thomas
Hi,
vielleicht erkläre ich doch nochmal mein Problem genauer.
Also ich habe ein XML File A, in der unter anderem eine Tabelle enthalten ist. Die Tags sind xhtml Tags (also xhtml:table, xhtml:tbody ...). Diese xhtml sollen raus indem ich aus dem XML File ein neues XML File B mit Hilfe des neuen XSL_1 erstelle. Soweit so gut (das klappt ja jetzt auch).
Nun soll das neue XML File B in ein HTML File C transformiert werden (mit einem XSL_2) und alle Tags und die Tabelle sollen enthalten sein. Nun werden aber mit dem neuen XSL_2 die gerade erstellen Tabellen Tags einfach ignoriert (aus irgendwelchen Gründen die ich nicht verstehe) und somit die Tabelle nicht ordentlich angezeigt. Ich sehe nur die Inhalte der Spalten.
Als ich aber die Tabellen Tags in CDATA transformiert hatte (mit dem alten XSL_1) und ein <html> darum gesetzt habe, wurde die Tabelle später in dem HTML File C angezeigt.
Hier mal mein XSL_2 (Ausschnittsweise):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml" >
<xsl:output method="html" indent="no" encoding="UTF-8"/>
<xsl:template match="data">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" />
<style controlStyle="controlStyle">...</style>
<style tableEditor="TableStyleRulesID">...</style>
</head>
<body style="BACKGROUND-COLOR: #ffffff">
<span>
<xsl:attribute name="style">...
</xsl:attribute>
<div>
<xsl:apply-templates select="meineForm" mode="_480"></xsl:apply-templates>
</div>
...
</span>
</body>
</html>
</xsl:template>
...
</xsl:stylesheet>
Ich hoffe mein Problem ist jetzt irgendwie besser zu verstehen.
Gruß
Joy
Hi,
nochmal ein Nachtrag. Ich glaube er zeigt die Tabelle nicht an, weil er sie nicht kennt. Das letzte Stylesheet (XSL_2) kennt nur die Struktur
<data>
<meinText/>
<meineForm>...
<meineListe>...</meineListe>
<meineTabelle>...</meineTabelle>
</meineForm>
</data>
Könnte es daran liegen, dass er meine Tabelle nicht anzeigt, weil es in der Struktur vorher nicht vorgesehen war, das es eine Tabelle geben kann, wie hier
<meineTabelle>
<table><body>...</body></table>
</meineTabelle>
und er deshalb nur die Texte in den Spalten ausliest und ausgibt?
Gruß
Joy
Hallo,
nochmal ein Nachtrag. Ich glaube er zeigt die Tabelle nicht an, weil er sie nicht kennt. Das letzte Stylesheet (XSL_2) kennt nur die Struktur
<data>
<meinText/>
<meineForm>...
<meineListe>...</meineListe>
<meineTabelle>...</meineTabelle>
</meineForm>
</data>Könnte es daran liegen, dass er meine Tabelle nicht anzeigt, weil es in der Struktur vorher nicht vorgesehen war, das es eine Tabelle geben kann, wie hier
<meineTabelle>
<table><body>...</body></table>
</meineTabelle>und er deshalb nur die Texte in den Spalten ausliest und ausgibt?
Das ist genau der Grund.
Also wenn deine erste Tranformation ein XML erzeugt, wäre eigentlich das hier (aus: https://forum.selfhtml.org/?t=154268&m=1005522
<xsl:template match="data">
<html>
<head>
<title />
</head>
<body>
xsl:copy
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</body>
</html>
</xsl:template>
Unnötig.
Da würde schon so etwas reichen:
<xsl:template match="data">
xsl:copy
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
In dem XML (XML File B) für die zweiten Transformation würde dann so etwas stehen:
-----------
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" deltaxml:delta="WFmodify" xml:lang="en-us">
<table class="dataTableStyle msoUcTable" ... border="1">
<tbody>
<tr>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div> </div>
----------
Beziehungsweise, wenn du in der ersten Transformation für deine "meineForm" "meineTabelle" etc. Elemente das Template erstellt hast dann so etwas:
<data xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" deltaxml:delta="WFmodify" xml:lang="en-us">
<meineForm>
<meineTabelle>
<table class="dataTableStyle msoUcTable" ... border="1">
<tbody>
<tr>
<td style="FONT-SIZE: 11px" class="readonlyGroupDataStyle">
<div> </div>
...
</meineTabelle>
</meineForm>
Jetzt _muss_ du natürlich in deinem zweiten XSLT dafür sorgen, dass Templates für die HTML-Elemente (also für die Tabelle aus dem XML File B) vorhanden sind:
--------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml" >
<xsl:output method="html" indent="no" encoding="UTF-8"/>
<xsl:template match="data">
<html>
<head> ... </head>
<body>
<xsl:apply-templates select="meineForm" mode="_480" />
</body>
</html>
</xsl:template>
...
<xsl:template match="table">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
Das einzige was hier bei diesem Lösungsweg noch geben könnte, dass du nochmal auf die Namensräume schauen musst und sie ggf. richtigstellen.
Aber auch wenn du jetzt, wo die erste Transformation funktioniert, daran nicht mehr rüttelst, brauchst du in der zweiten XSLT noch immer das Template für die Tabelle.
Grüße
Thomas
PS: bitte du so etwas <body><span> ... gesamter Seitenihalt ... </span></body> doch keinem an! ;-)
Hi,
Das einzige was hier bei diesem Lösungsweg noch geben könnte, dass du nochmal auf die Namensräume schauen musst und sie ggf. richtigstellen.
Aber auch wenn du jetzt, wo die erste Transformation funktioniert, daran nicht mehr rüttelst, brauchst du in der zweiten XSLT noch immer das Template für die Tabelle.
Nachdem ich das Template für die Tabelle jetzt ins zweite XSL eingefügt habe, gehts endlich :-)
Vielen lieben Dank für deine Hilfe. Du hast mir echt sehr geholfen.
PS: bitte du so etwas <body><span> ... gesamter Seitenihalt ... </span></body> doch keinem an! ;-)
OK :-) Bin ja noch beim Lernen von XML und XSL.
Gruß
Joy
Hallo,
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xhtml" version="1.0">
bei mir ist handelt es sich um ein xsl:transform Stylesheet
Das ist vollkommen ein und dasselbe.
Grüße
Thomas