Martin K.: Xml mit xsl hierarchisch ausgeben

Hallo,

ich suche eine Möglichkeit ein XML-Dokument hierarchisch auszugeben also jeweils den local-name(), text() und Attribute eines Knotens.
Ich möchte die Werte wie text() und die Attribute aber nur ausgeben wenn es die gibt.
Ich würde gerne so eine Ansicht wie sie der IE von XML-Dateinen erzeugt, eine hieraische Darstellung!

Danke
Martin

  1. Kannst du ein Beispiel geben? Wie soll der Output sein, text, xml?
    Auf der sicheren Seite würdest du mit einem rekursiven template gehen, aber so ganz weiss man halt nicht, was du machen möchtest.

    Gruß

    1. Hallo Holge r,

      Am liebsten wäre mir eine Umwandlung in HTML.
      Dann rekursiv die Struktur des XML Dokumentes ausgeben.
      Ich hatte hier mal was mir for.each gemacht ist aber nicht so elegant außerdem werden alles Knoten, also auch die die keine Atribute oder text() haben, ausgegeben.

      <xsl:for-each select="//descendant::*">

      Knoten Name:

      <font class="name"  >
       <xsl:value-of select="local-name()"></xsl:value-of>
      </font>

      Wert:

      <font class="wert"  >
       <xsl:value-of select="text()"></xsl:value-of>
      </font>

      Attribute:

      <xsl:for-each select="@*">
      Name:
      <font class="attribute"  >
       <xsl:value-of select="local-name()"></xsl:value-of>
       </font>
       Wert:
       <font class="attribute"  >
        <xsl:value-of select="."></xsl:value-of>
         </font>
       </xsl:for-each>

      <br></br>
      </xsl:for-each>

      Danke

      Martin

      1. OK, als beispiel mal eine rekursive Variante die man natuerlich noch verfeinern kann. Gruß, H.

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
            <xsl:output method="html"/>
            <xsl:template match="/">
                <html>
                    <head/>
                    <body>
                        <xsl:for-each select="node()">
                            <xsl:call-template name="RekursivesTemplate"/>
                        </xsl:for-each>
                    </body>
                </html>
            </xsl:template>
            <xsl:template name="RekursivesTemplate">
                <xsl:param name="Level" select="1"/>
                <div style="{concat('padding-left:',$Level * 5)}">
                    <xsl:value-of select="concat($Level,'. Stufe')"/>
                    xsl:text Element: </xsl:text>
                    <b>
                        <xsl:value-of select="local-name()"/>
                    </b>
                    <xsl:if test="@*">
                        xsl:text Attribute: </xsl:text>
                        <xsl:for-each select="@*">
                            xsl:text </xsl:text>
                            <b>
                                <xsl:value-of select="local-name()"/>
                            </b>
                        </xsl:for-each>
                    </xsl:if>
                    <xsl:if test="self::text() != ''">
                        xsl:text Textknoten: </xsl:text>
                        <b><xsl:value-of select="text()"/></b>
                    </xsl:if>
                </div>
                <!-- rekursiver Aufruf -->
                <xsl:for-each select="child::*">
                    <xsl:call-template name="RekursivesTemplate">
                        <xsl:with-param name="Level" select="$Level + 1"/>
                    </xsl:call-template>
                </xsl:for-each>
            </xsl:template>
        </xsl:stylesheet>

  2. Hallo Martin,

    Ich würde gerne so eine Ansicht wie sie der IE von XML-Dateinen erzeugt, eine hieraische Darstellung!

    Dann schaue mal nach, wei der IE das intern regelt (über die Adresszeile):
    res://msxml.dll/defaultss.xsl

    Das klappt bei mir im IE6, aber nicht mehr im IE7. Es gibt auch Alternativen.

    Grüße,
    Thomas