g-punkt: gleiche elemente nur 1x anzeigen

!!! xsl soll nur die verschiedenen classes ausgeben !!!

als bsp:
xml

<lifeform>
 <id>jkfan-3245</id>
 <class>plant</class>
 </more>
</lifeform>
<lifeform>
 <id>34424j_knnanfn</id>
 <class>animal</class>
 </more>
</lifeform>
<lifeform>
 <id>tegvx-365</id>
 <class>animal</class>
 </more>
</lifeform>
<lifeform>
 <id>jkfan-3245</id>
 <class>plant</class>
 </more>
</lifeform>
.....usf.

!!! xsl soll nur die verschiedenen classes ausgeben !!!

also zb sollte dann im html
<p>animal</p>
<p>plant</p>
stehen

sozusagen sollen alle <class> angezeigt werden die es gibt (aber nicht ALLE aufgezählt mit xsl for-each)

TIA, g.

  1. nachtrag:
    "gleiche elemente" ist nicht korrekt

    ich möchte gleichen _inhalt_ eines elements nur 1x ausgeben

  2. Hallo g-punkt!

    Klingt diese Begrüßung auch irgendwie seltsam für Dich? Denk mal drüber nach ;)

    !!! xsl soll nur die verschiedenen classes ausgeben !!!

    als bsp:
    xml

    <lifeform>
    <id>jkfan-3245</id>
    <class>plant</class>
    </more>
    </lifeform>

    Warum ist hier ein </more>? Wo ist das <more>? Sinnvollerweise sollte es so aussehen:

    <lifeform>
      <more>
        <id>jkfan-3245</id>
        <class>plant</class>
      </more>
    </lifeform>

    Dann mach doch lieber sowas draus:

    <lifeform id="jkfan-3245">plant</lifeform>
    <lifeform id="34424j_knnanfn">animal</lifeform>

    oder noch besser:

    <lifeform id="jkfan-3245" class="plant" />
    <lifeform id="34424j_knnanfn" class="animal" />

    Wenn Du dann noch ein weiteres Attribut einfügst, z.B.

    <lifeform id="jkfan-3245" class="plant" amount="4711"/>
    <lifeform id="34424j_knnanfn" class="animal" amount="42"/>

    Brauchst Du Dir auch wegen der Anzahl keine Sorgen machen.

    Dies alles setzt allerdings voraus, daß Du diese Datei selber bearbeiten, erstellen und verformen kannst/darfst/mußt!

    Grüße aus Spandau

    Masin Al-Dujaili

    1. danke dass du dich des ganzen annimmst aber du hast den kern des pudels verfehlt (im gegensatz zu franz)

      das ganze is ja nur n bsp und more steht für zig weitere elemente (sollte eher <more/> sein zugegeben)

      ad anzahl
      es gibt da mindestens 40 classes die als liste nur 1x ausgegeben werden sollen - in den abertausenden datensätzen kommen diese 40 allerdings abertausende male vor ;) -> ergo will ich die unterschiedlichen classes aber nur 1x ausgeben (für ne optionbox) oder testweise einfach in <p></p> gehüllt

      Hallo g-punkt!

      Klingt diese Begrüßung auch irgendwie seltsam für Dich? Denk mal drüber nach ;)

      !!! xsl soll nur die verschiedenen classes ausgeben !!!

      als bsp:
      xml

      <lifeform>
      <id>jkfan-3245</id>
      <class>plant</class>
      </more>
      </lifeform>

      Warum ist hier ein </more>? Wo ist das <more>? Sinnvollerweise sollte es so aussehen:

      <lifeform>
        <more>
          <id>jkfan-3245</id>
          <class>plant</class>
        </more>
      </lifeform>

      Dann mach doch lieber sowas draus:

      <lifeform id="jkfan-3245">plant</lifeform>
      <lifeform id="34424j_knnanfn">animal</lifeform>

      oder noch besser:

      <lifeform id="jkfan-3245" class="plant" />
      <lifeform id="34424j_knnanfn" class="animal" />

      Wenn Du dann noch ein weiteres Attribut einfügst, z.B.

      <lifeform id="jkfan-3245" class="plant" amount="4711"/>
      <lifeform id="34424j_knnanfn" class="animal" amount="42"/>

      Brauchst Du Dir auch wegen der Anzahl keine Sorgen machen.

      Dies alles setzt allerdings voraus, daß Du diese Datei selber bearbeiten, erstellen und verformen kannst/darfst/mußt!

      Grüße aus Spandau

      Masin Al-Dujaili

  3. Hallo g-punkt (Hast du zuviel "Helden wie wir" gelesen oder?),

    Eine einfache Lösung für kleinere Dateien ist:

    XML-Datei:

    <?xml version="1.0"?>
    <?xml-stylesheet href="doppelt.xsl" type="text/xsl"?>
    <lifeforms>
      <lifeform>
       <id>jkfan-3245</id>
       <class>plant</class>
       <more/>
      </lifeform>
      <lifeform>
       <id>34424j_knnanfn</id>
       <class>animal</class>
       <more/>
      </lifeform>
      <lifeform>
       <id>tegvx-365</id>
       <class>animal</class>
       <more/>
      </lifeform>
      <lifeform>
       <id>jkfan-3245</id>
       <class>plant</class>
       <more/>
      </lifeform>
    </lifeforms>

    XSLT

    gibt Liste von Inhalten der class-Elemente aus, wobei Doppelte eliminiert werden

    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    version="1.0"
                    >
    <xsl:variable name="classesOhneDoppelte" select="//class[not(.=following::class)]"/>
      <xsl:template match="/">
        <html>
          <head>
            <title>doppelte Elementinhalte eliminieren</title>
          </head>
          <body>
            <xsl:for-each select="$classesOhneDoppelte">
              <p>
                <xsl:value-of select="."/>
              </p>
            </xsl:for-each>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>

    Du liest alle Inhalte von class-Elementen in eine Variable ein, wenn es nicht ein weiteres class-Element (auf der following-Achse) gibt, das denwelben Inhalt hat.
    Etwas klarer wird das, wenn Du es folgendermaßen schreibst:
    <xsl:variable name="classesOhneDoppelte" select="//class[not(./text()=following::class/text())]"/>

    Gruß
    Franz

    1. kewl, muss ich gleich mal ausprobieren :) THX!

      Hallo g-punkt (Hast du zuviel "Helden wie wir" gelesen oder?),

      Eine einfache Lösung für kleinere Dateien ist:

      XML-Datei:

      <?xml version="1.0"?>
      <?xml-stylesheet href="doppelt.xsl" type="text/xsl"?>
      <lifeforms>
        <lifeform>
         <id>jkfan-3245</id>
         <class>plant</class>
         <more/>
        </lifeform>
        <lifeform>
         <id>34424j_knnanfn</id>
         <class>animal</class>
         <more/>
        </lifeform>
        <lifeform>
         <id>tegvx-365</id>
         <class>animal</class>
         <more/>
        </lifeform>
        <lifeform>
         <id>jkfan-3245</id>
         <class>plant</class>
         <more/>
        </lifeform>
      </lifeforms>

      XSLT

      gibt Liste von Inhalten der class-Elemente aus, wobei Doppelte eliminiert werden

      <?xml version="1.0"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      version="1.0"
                      >
      <xsl:variable name="classesOhneDoppelte" select="//class[not(.=following::class)]"/>
        <xsl:template match="/">
          <html>
            <head>
              <title>doppelte Elementinhalte eliminieren</title>
            </head>
            <body>
              <xsl:for-each select="$classesOhneDoppelte">
                <p>
                  <xsl:value-of select="."/>
                </p>
              </xsl:for-each>
            </body>
          </html>
        </xsl:template>
      </xsl:stylesheet>

      Du liest alle Inhalte von class-Elementen in eine Variable ein, wenn es nicht ein weiteres class-Element (auf der following-Achse) gibt, das denwelben Inhalt hat.
      Etwas klarer wird das, wenn Du es folgendermaßen schreibst:
      <xsl:variable name="classesOhneDoppelte" select="//class[not(./text()=following::class/text())]"/>

      Gruß
      Franz

    2. Hallo g-punkt (Hast du zuviel "Helden wie wir" gelesen oder?),

      Eine einfache Lösung für kleinere Dateien ist:

      ...

      gibt Liste von Inhalten der class-Elemente aus, wobei Doppelte eliminiert werden

      ...

      Gruß
      Franz

      vor allem muss ich dir gratulieren mich besser verstanden zu haben als ich mich artikulieren konnte :)))) genau das will ich >> doppelte eliminieren!