Maik: Alle Einträge aus XML

Hallo,

ich wollte alle Einträge einer XML Datei ausgeben(in der Reihenfolge in der sie auch in der XML Datei stehen).

-Ich dachte es geht so:

<xsl:for-each select="."> // alle Einträge
    xsl:choose          // Jetzt wollte ich die verschiedenen Tags
                          // identifizieren (damit ich jeden Tag
                          //anders Formatieren kann)
        <xsl:when test="test">
            <xsl:value-of select="test/text()"/>
        </xsl:when>
        <xsl:when test="form">
            <xsl:value-of select="form/text()"/>
        </xsl:when>
        <xsl:when test="form/kreis">
            <xsl:value-of select="form/kreis/text()"/>
        </xsl:when>

Leider Funktionier es so nicht. Ich kriege immer nur den ersten Eintrag(also test="test")! Wenn ich test="form" als erstes in die Choose Anweisung schreibe, bekomme ich NUR test="form". Ich dachte <xsl:for-each select="."> durchläuft alle Einträge?

Gruß

Maik

  1. Hi,

    ich wollte alle Einträge einer XML Datei ausgeben(in der Reihenfolge in der sie auch in der XML Datei stehen).

    versuch das mal wenn einfach nur alles ausgegeben werden soll:

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no" media-type="text/plain" />
    <xsl:template match="/">
     xsl:apply-templates/
    </xsl:template>
    <xsl:template match="text()">
     <xsl:value-of select="normalize-space(current())" />
    </xsl:template>
    </xsl:stylesheet>

    ciao,
    dubaischeich

  2. Hallo,

    <xsl:for-each select="."> // alle Einträge

    Das war dein Fehler, der Punkt "." meint current node d.h. gegenwärtiger Knoten.

    Was du wohl meintest ist: <xsl:for-each select="*"> was hier alle Elemente meint, aber nicht desto trotz nur innerhalb des Elementes in dessen Template dein for-each steht.

    Güße
    Thomas

  3. Hi,

    ich wollte alle Einträge einer XML Datei ausgeben(in der Reihenfolge in der sie auch in der XML Datei stehen).
    -Ich dachte es geht so:

    <xsl:for-each select="."> // alle Einträge
        xsl:choose          // Jetzt wollte ich die verschiedenen Tags
                              // identifizieren (damit ich jeden Tag
                              //anders Formatieren kann)

    Du kennst xsl:template und xsl:apply-templates?
    xsl:for-each ist fast immer durch templates zu ersetzen - und in diesem Fall garantiert.
    (wann immer möglich benutze ich xsl:apply-templates/xsl:template anstelle von xsl:for-each - dadurch habe ich zwar viele, aber oft sehr kleine, gut überschaubare templates)

    <xsl:when test="test">

    im test-Attribut muß eine Bedingung stehen. "test" ist keine Bedingung, sondern ein String - der dürfte immer als wahr ausgewertet werden, also wird immer nur dieser Zweig erreicht...

    Leider Funktionier es so nicht. Ich kriege immer nur den ersten Eintrag(also test="test")! Wenn ich test="form" als erstes in die Choose Anweisung schreibe, bekomme ich NUR test="form". Ich dachte <xsl:for-each select="."> durchläuft alle Einträge?

    Beschäftige Dich mit der Funktionsweise von xsl:template (insbes. mit dem match-Attribut) sowie mit der Arbeitsweise des xsl:apply-templates.

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/