martin sejrek: Mit XSL will ich die vollstaendige Baumstruktur ausgeben.

Hallo,

ich setze seit 1 Monat XML ein und bin soweit sehr zufrieden. Eine Sache erscheint etwas komplexer zu sein. Wer kann mir einen Anhaltspunkt geben, wie ich mit XSL oder XSLT (Xpath) ein XML Dokument vollstaendig ausgeben kann. Das Problem ist nicht den test auf einen Xpath, vielmehr die einzelnen childs tiefe fuer tiefe auszugeben. Normalerweise loese ich solche Dinge mit Rekursion. Ich kann mir vorstelle, dass es auch in XSL geht.

Ich danke fuer jeden Ansatz.

Gruss

martin

  1. Hallo Martin,

    Wer kann mir einen Anhaltspunkt geben, wie ich mit XSL oder XSLT (Xpath) ein XML Dokument vollstaendig ausgeben kann.

    Mittels xsl:copy-of. Das folgende Style-Sheet kopiert dir das gesamte Quelldokument in den Ergebnisbaum. Rekursion ist dabei nicht notwendig, da xsl:copy-of die Kinder des gegenwärtigen Knotens mit ins Ergebnisdokument schreibt.

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">

    <xsl:copy-of select="node()"/>

    </xsl:template>

    </xsl:stylesheet>

    Gruß
    Franz

    1. Hallo Martin,

      Hallo auch,

      Wer kann mir einen Anhaltspunkt geben, wie ich mit XSL oder XSLT (Xpath) ein XML Dokument vollstaendig ausgeben kann.

      Mittels xsl:copy-of. Das folgende Style-Sheet kopiert dir das gesamte Quelldokument in den Ergebnisbaum. Rekursion ist dabei nicht notwendig, da xsl:copy-of die Kinder des gegenwärtigen Knotens mit ins Ergebnisdokument schreibt.

      danke erst einmal. ich dachte schon, dass sich keiner meldet.

      <?xml version="1.0"?>
      <xsl:stylesheet version="1.0"
                      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:template match="/">

      <xsl:copy-of select="node()"/>

      </xsl:template>

      </xsl:stylesheet>

      nun, ich habe es auf ein xml file getestet. funktioniert nicht wirklich. meine loesung ist da etwas anders ausgefallen:
      mit xsl:template<xsl:apply-tamplates /> habe ich eine rekursion hinbekommen. das funktioniert sehr gut. ich danke dir!!!

      Gruß
      Franz

      gruss zurueck,
      martin

      1. hallo,

        sorry, dass ich mich noch einmische, aber du hast dich sehr unpräzise ausgedrück:

        "Wer kann mir einen Anhaltspunkt geben, wie ich mit XSL oder XSLT (Xpath) ein XML Dokument vollstaendig ausgeben kann."

        das kannst du nur mit xsl:copy-of.

        meine loesung ist da etwas anders ausgefallen:
        mit xsl:template<xsl:apply-tamplates /> habe ich eine rekursion hinbekommen. das funktioniert sehr gut.

        du hast nicht davon gesagt, dass du eine (vermutlich html) transformation brauchst.

        grüße
        thomas

        1. hallo,

          hallo auch,

          sorry, dass ich mich noch einmische, aber du hast dich sehr unpräzise ausgedrück:

          Du hast recht, ich moechte mich dafuer entschuldigen!

          "Wer kann mir einen Anhaltspunkt geben, wie ich mit XSL oder XSLT (Xpath) ein XML Dokument vollstaendig ausgeben kann."

          das kannst du nur mit xsl:copy-of.

          nur? Ich glaube nicht ganz:

          ---------------------------
          </xsl:template>

          <xsl:template match="dbs:subfolder">
           <LI CLASS="clsHasKids"><xsl:value-of select="@id" />
           <UL>
           <xsl:for-each select="dbs:link">
            <LI>
             <A TARGET="content">
              <xsl:attribute name="HREF"><xsl:value-of select="url" /></xsl:attribute>
              <xsl:value-of select="title" />
             </A>
            </LI>
           </xsl:for-each>
           <xsl:if test="dbs:subfolder"><xsl:apply-templates /></xsl:if>
           </UL>
           </LI>
          </xsl:template>
          ----------------------------------

          meine loesung ist da etwas anders ausgefallen:
          mit xsl:template<xsl:apply-tamplates /> habe ich eine rekursion hinbekommen. das funktioniert sehr gut.

          du hast nicht davon gesagt, dass du eine (vermutlich html) transformation brauchst.

          Ja! Thomas ich gebe Dir absolut Recht. Es war mir zu diesem Zeitpunkt nicht ganz klar. Keine Zeit, neue Technik und zu frisch.

          grüße
          thomas

          Schoenen Gruss zurueck. Ich danke Dir und hoffe Dir auch mal helfen zu koennen.

          PS: Wie genau soll das mit <xsl:copy funktionieren? Wuerde mich mal interessieren. Wenn Du lust hast... cu.

          1. hallo,

            das kannst du nur mit xsl:copy-of.
            nur? Ich glaube nicht ganz:

            </xsl:template>

            ... cut ...

            </xsl:template>

            das war hier eine simlpe transformation. du hast hier einen teil deines xml dokuments zu html transformiert.

            PS: Wie genau soll das mit <xsl:copy funktionieren? Wuerde mich mal interessieren. Wenn Du lust hast... cu.

            --
            so (ich habe hier die dateien für cocoon aufbereitet)
            xml datei:
            ----
            <?xml version="1.0"?>
            <?xml-stylesheet href="xsl_copy.xsl" type="text/xsl"?>
            <?cocoon-process type="xslt"?>

            <ROOT>
               <DATA>
                  <NAME>Huber</NAME>
                  <VORNAME>Andreas</VORNAME>
                  <ID>64</ID>
               </DATA>
               <DATA>
                  <NAME>Meier</NAME>
                  <VORNAME>Matthias</VORNAME>
                  <ID>23</ID>
               </DATA>
                  <DATA>
                  <NAME>Huber</NAME>
                  <VORNAME>Matthias</VORNAME>
                  <ID>22</ID>
               </DATA>
            </ROOT>
            -----
            die xsl datei:
            ---
            <?xml version="1.0"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

            <xsl:template match="/">
            <xsl:processing-instruction name="cocoon-format">type="text/html"</xsl:processing-instruction>
               <html>
                  <head>
                     <title>xsl:copy-of</title>
                  </head>
               <body>
                  <pre>
                     <xsl:copy-of select="node()"/>
                  </pre>
               </body>
               </html>
              </xsl:template>
            </xsl:stylesheet>
            --------
            der quelltext der erzeugten html datei:
            ---
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
            <html><head><title>xsl:copy-of</title></head><body><pre>
            <?xml-stylesheet href="xsl_copy.xsl" type="text/xsl"?>
            <ROOT>
               <DATA>
                  <NAME>Huber</NAME>
                  <VORNAME>Andreas</VORNAME>
                  <ID>64</ID>
               </DATA>
               <DATA>
                  <NAME>Meier</NAME>
                  <VORNAME>Matthias</VORNAME>
                  <ID>23</ID>
               </DATA>
                  <DATA>
                  <NAME>Huber</NAME>
                  <VORNAME>Matthias</VORNAME>
                  <ID>22</ID>
               </DATA>
            </ROOT>
            </pre></body></html>
            -----
            diese html ausgabe habe ich nur gemacht damit du siehst, wie das xsl:copy-of funktioniert. es kann manchmal notwendig sein, den source-treee oder auch nur teile davon in eine xsl datei hineinzukopieren und dann erst weitere arbeitsschritte zu machen.

            grüße
            thomas