Announcement

Collapse
No announcement yet.

Elementliste

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

  • Elementliste

    Hallo liebe Gemeinde,

    ich habe ein kleines Problem:

    Ich möchte von einer XML-Datei alle Elemente auflisten, die in einem Dokument vorkommen. Zu jedem Elment hätte ich gern alle vorherigen Elemente (ancestor). Sollte aber das gleiche Element unterschiedliche Vorgänger haben, sei es auch nur eine geringe Abweichung, möchte ich das Element noch einmal ausgeben mit dessen Vorgängern.

    Ein Beispiel:

    Code:
    <dok>
      <ebene>
        <heading>Ueberschirft</heading>
        <para>Das ist Text</para>
      </ebene>
      <anhang>
        <heading>Anhang 1</heading>
        <para>Ein Anhang</para>
      </anhang>
    </dok>
    Als Resultat möchte ich also erhalten:

    Code:
    dok - keine Vorgänger
    ebene - dok
    anhang - dok
    heading - ebene, dok
    heading - anhang, dok
    para - ebene, dok
    para - anhang, dok
    Ist das ohne weiteres mit XSLT möglich? Ich habe es noch nicht hinbekommen die Dopplungen zu unterdrücken.

    Danke für eure Hilfe, Gruß Z-MAN

  • #2
    Bitte den bereits vorliegenden Code zeigen.

    Comment


    • #3
      bisheriger Code...

      Hallo Thomas,

      der bisherige Code sieht folgendermaßen aus:

      Code:
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet
        version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      >
       <xsl:output method="text" indent="yes" />
      
      
        <xsl:template match="/">
          <xsl:for-each select="//*[not(name() = preceding::*/name())]">
            <xsl:value-of select="name()"/>
            <xsl:text>
      </xsl:text>
          </xsl:for-each>
        </xsl:template>
      
      </xsl:stylesheet>
      Hiermit kann ich zwar jedes Element einmal ausgeben, aber noch ohne diese gewünschte Bedingung. Ich überprüfe ja nur auf gleichheit des Elementnamens. Ich steh aber gerade irgendwie auf dem Schlauch, da ich nicht weiß, wo ich ansetzen muss.

      Vielleicht kannst du mir weiterhalfen.
      Gruß

      Comment


      • #4
        In Deinem Code kommt die ancestor-Achse gar nicht vor. Dieser Ansatz geht etwas weiter:
        Code:
        <xsl:template match="/">
          <xsl:for-each select="//*">
            <xsl:value-of select="name()"/><xsl:text> - </xsl:text>
            <xsl:if test="count(ancestor::*) = 0"><xsl:text>keine Vorgänger</xsl:text></xsl:if>      
            <xsl:for-each select="ancestor::*">
              <xsl:sort select="position()" order="descending"/>
              <xsl:value-of select="name()"/>
              <xsl:if test="position()!=last()"><xsl:text>, </xsl:text></xsl:if>
            </xsl:for-each>
            <xsl:text>&#xA;</xsl:text>
          </xsl:for-each>
        </xsl:template>
        Ergebnis:
        Code:
        dok - keine Vorgänger
        ebene - dok
        heading - ebene, dok
        para - ebene, dok
        anhang - dok
        heading - anhang, dok
        para - anhang, dok

        Comment


        • #5
          Hallo Thomas,

          vielen Dank für deine Hilfe. Jetzt habe ich also für jedes Element seine Vorgänger-Elemente.

          Kann ich denn auch erreichen, ein Element mit seinen Vorgängern nur einmal aufzulisten? Ein Beispiel:

          Code:
          <dok>
            <ebene>
              <heading>Ueberschirft</heading>
              <para>Das ist Text</para>
              <para>Das ist auch Text</para>
              <para>Das ist ebenso Text</para>
            </ebene>
            <anhang>
              <heading>Anhang 1</heading>
              <para>Ein Anhang</para>
            </anhang>
          </dok>
          In diesem Fall würde ich das Element <para> 4x ausgegeben bekommen, aber es würde ja für den Fall <para> in <ebene> eine einmalige Ausgabe genügen.
          Ist die denn möglich?
          Man müsste ja schon bei der ersten Schleife

          Code:
          <xsl:for-each select="//*">
          eine Bedingung mit einbauen, das nur das Element ausgegeben wird, dessen XPath zur Suche nach seinem Vorgängern nicht öfter vorkommt. Sehe ich das richtig?

          Vielen Dank, Z-MAN

          Comment

          Working...
          X