xml-Inhalt in hash
Paul Brunner
- xsl
0 Thomas J.S.0 Paul Brunner0 fjh
Hallo zusammen,
ich versuche gerade ein xsl-Sheet zu erstellen das den Inhalt eines xml-files mit beliebigen tags in ein hash der Form [name]->[inhalt] überträgt.
Meine ersten Veruche sind kläglich gescheitert:
*-------------
<xsl:template match="/">
<xsl:for-each select="*">
<xsl:value-of select="name(.)"/>
xsl:text - </xsl:text>
<xsl:value-of select="."/><br />
</xsl:for-each>
</xsl:template>
*--------------
Zur Veranschaulichung ein kleines Beispiel
Aus...
*------------
<document>
<header>
<name>Ein Dokument</name>
<title>Untertitel</title>
<date>20020518</date>
<author>ich</author>
</header>
<content>
<text>blabla</text>
</content>
</document>
*----------
soll werden:
*----------
document -
header -
name - Ein Dokument
title - Untertitel
date - 20020518
content -
text - blabla
*----------
im Endausbau soll daraus werden
*----------
document/header/name - Ein Dokument
document/header/title - Untertitel
document/header/date - 20020518
document/content/text - blabla
*----------
also statt der Namen die kompletten Achsen und Tags ohne Text-Knoten ignorieren. Damit ist das xml-file dann auch wieder reproduzierbar.
Aber für Anregungen zum ersten Schritt währe ich schon sehr dankbar
Gruß
Paul
hallo,
Meine ersten Veruche sind kläglich gescheitert:
*-------------
<xsl:template match="/">
<xsl:for-each select="*">
<xsl:value-of select="name(.)"/>
xsl:text - </xsl:text>
<xsl:value-of select="."/><br />
</xsl:for-each>
</xsl:template>
*--------------
war fast richtig:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title></title></head>
<body>
<xsl:for-each select="//*">
<p>
<xsl:value-of select="name(.)"/>
xsl:text - </xsl:text>
<xsl:value-of select="."/><br />
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
-----------------------------
im Endausbau soll daraus werden
*----------
document/header/name - Ein Dokument
document/header/title - Untertitel
document/header/date - 20020518
document/content/text - blabla
*----------
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title></title></head>
<body>
<xsl:for-each select="//*">
<p>
<xsl:for-each select="ancestor::*"><xsl:value-of select="name(.)" />/</xsl:for-each>
<xsl:value-of select="name(.)"/>
xsl:text - </xsl:text>
<xsl:value-of select="."/><br />
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
-----------
den rest kriegst du schon hin ;-)
grüße
thomas
Dankeschön,
den rest kriegst du schon hin ;-)
da war ich doch schon näher dran als ich dachte, daß heißt wohl nachsitzen und die xpath-Syntax nochmal genauer studieren :-)
Gruß
Paul
Hallo Paul,
da war ich doch schon näher dran als ich dachte, daß heißt wohl nachsitzen und die xpath-Syntax nochmal genauer studieren :-)
Du brauchst eigentlich nur noch den Test, ob der gegenwärtige Knoten nur einen Knoten als Kindknoten hat, der ein Textknoten ist. Dies kannst du z.B. so abfragen:
<xsl:if test="./node()[1] = text()">
Damit funktioniert eigentlich alles mit dem Code von Thomas.
Gruß
Franz
PS: Warum machst Du das eigentlich? Ist das ne Übung oder warum wandelts du eine XML-Datei in ein Format um, das die gleiche Datei repräsentiert nur anders?