Announcement

Collapse
No announcement yet.

Elementnamen einmal ausgeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Elementnamen einmal ausgeben

    Ich möchte die in einem Dokument vorkommenden Elementnamen einmal ausgeben.<br>
    Bisher habe ich nur was gefunden, das nicht die Namen sondern die Inhalte vergleicht.<br>
    Wer kennt den Weg?<br>

    Bernward

  • #2
    Hallo,<br>
    <code>
    <xsl:for-each select="//node()">
    <xsl:value-of select="name()"/>
    </xsl:for-each>
    </code>
    <br>
    Michae

    Comment


    • #3
      Hallo,
      Jetzt kommen aber immer noch alle Namen mehrfach herraus. Jeder Knotenname soll nur einmal ausgegeben werden.
      <br>
      Bernwar

      Comment


      • #4
        Hallo Bernward,

        Um die Duplicates zu filtern:
        <xsl:for-each select="//node()[not(.=preceding::node())]">
        <xsl:value-of select="name()"/>
        </xsl:for-each>
        Das sollte dein Problem lösen

        Mich

        Comment


        • #5
          Hallo Michael, <br>
          Dein Vorschlag beseitigt Knoten mit geleichen Inhalten. Ich möchte aber jeden Knoten<b>namen</b> nur einmal erhalten.
          ( zumindesten wirft der saxon Transformator mehrmals den gleichen Namen aus.)

          Bernwar

          Comment


          • #6
            Hallo,<br>
            es ist durchaus möglich, dass SAXON auch den text()-Knoten einen Namen zuordnet - das ist eigentlich nicht korrekt. Wenn das der Fall ist, würde er für jedes Element, das einen Inhalt hat, den Namen mindetstens zweimal ausgeben. Bei Elementen ohne Inhalte (z.B. <element/> ) dürfte das nicht der Fall sein. Einfach mal überprüfen. Gruss, Michael

            Comment


            • #7
              Hi
              Hier ein kurzes Beispiel:
              <doc><br>
              <Vorname>Ulli</Vorname><br>
              <Vorname>Flo</Vorname><br>
              </doc><br>

              Ich möchte als Ergebnis haben:<br>
              doc<br>
              Name<br>

              Obige Transformation liefert aber<br>
              doc<br>
              Name<br>
              Name<br>
              <br>
              Bernwar

              Comment


              • #8
                Aha - so langsam wird auch mir das Problem klar;-) Folgende Idee könnte ich anbieten:
                <pre>
                <xsl:for-each select="//node()[not(name()=name(following::node()))]">
                <xsl:value-of select="name()"/><br/>
                </xsl:for-each>
                </pre>
                Michae

                Comment


                • #9
                  Aus leidvoller Erfahrung habe ich den Eindruck, daß die Implementierung der preceding:: Achsen meist nicht so funktionier,
                  wie man sich das wünscht. Vor allem dann nicht, wenn das ganze rekursiv auf mehreren Dokumentebenen durchgeführt werden soll.
                  Mein Problem war ein Stylesheet zu erstellen, das ein Stylesheet-Skelett erzeugt, also für jedes Element ein template anlegt.
                  Die Lösung ist auf meiner Site <a href="http://www.xml-web.de" target="_blank">www.xml-web.de</a> beschrieben. Hier kann auch das
                  Stylesheet runtergeladen werden, das alle Elemente nur einmal ausgibt

                  Comment

                  Working...
                  X