Paul Brunner: xml-Inhalt in hash

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

  1. 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

    1. 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

      1. 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?