Steffen: in for-each - erstes Element was gefunden wird ausgeben

Hallo,

ich habe da ein Problem mit xslt. Ich habe folgende for-each-Schleife.

<xsl:for-each select="//descendant::*[contains(local-name(), 'Name')]/bgs:Daten">

<xsl:if test="position()  &lt; 5">

<xsl:value-of select="Ort"/>
          </xsl:if>
         </xsl:for-each>

Num gibt er mir alle Orte aus die kleine 5 sind. Wie macht man das wenn ich nur das erste Element haben will. Also sowas wie ein break, nachdem er eines gefunden hat. Mit sort?

danke Steffen

  1. hi,

    Wie macht man das wenn ich nur das erste Element haben will. Also sowas wie ein break, nachdem er eines gefunden hat.

    Wenn du nur eine Ausgabe des ersten Elementes willst - wozu denn dann überhaupt for-each?

    Dann versuche doch lieber, gleich nur dieses eine Element zu selektieren.
    http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm#position_bedingungen

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      das Problem ist, das XML-Dokument besteht aus verschiedenen Schichten. Diese müssen durchlaufen werden mit der einschränkung der position im xml-Dokument. Wenn es ein Kind-Element einer Schicht, hier in dem Bespiel "ort" gibt dann soll es ausgegeben werden. Er gibt mit aber immer alle aus die er findet?

      <xsl:for-each select="//descendant::*[contains(local-name(), 'Name')]/bgs:Daten">

      <xsl:if test="position()  &lt; 5">

      <xsl:value-of select="Ort"/>
                </xsl:if>
               </xsl:for-each>

      danke

      1. Hallo,

        Hallo,

        Er gibt mit aber immer alle aus die er findet?

        Definiere alles

        <xsl:if test="position()  &lt; 5">

        wozu dient diese Abfrage?

        bydey

        --
        -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
        -- Navigate all your PHP web projects with  PHP Project Browser--
        1. Hallo,

          also noch mal, folgende for-each: Zuerst wird geprüft ob den Knoten in der aktuellen Schicht gibt. Wenn es ihn gibt, gibt er ihn aus wenn nicht, kommt die folgende for-each. Er durchsucht jetzt die Schichten die Schichten unter der wo wir gerade sind. Deswegen die position "kleiner". Und ich brauche den letzen Wert, also den letzten Ort den er findet.  Wenn ich das so mache, wie unten findet er nicht. Wenn ich "position() = last()" wegnehmen findet er alle orte in alle darunter liegenden Schichten.

          <xsl:when test="not (boolean(ort))">
                  <xsl:for-each select="//descendant::*[contains(local-name(), 'Name')]/bgs:Daten[position()  &lt; ($anzahl_layer)-($positionsnummer)]">
                   <xsl:if test="position() = last() ">
                   <xsl:value-of select="ort"/>

          </xsl:if>
                   </xsl:for-each>
                   </xsl:when>

          Danke

          1. Hallo ich nochmal,

            habe gerade selbst probiert. Also 2 Werte werden in der Konstellation wie oben erklärt gefunden und wenn ich Position() = 2 mache gehts auch, aber warum nicht mit last() ???

            danke Steffen

            1. Hallo,

              habe gerade selbst probiert. Also 2 Werte werden in der Konstellation wie oben erklärt gefunden und wenn ich Position() = 2 mache gehts auch, aber warum nicht mit last() ???

              bist du sicher, daß sich position() auf dein Zwischenergebnis bezieht und nicht auf dein ursprünglichen Baum!?

              bydey

              --
              -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
              -- Navigate all your PHP web projects with  PHP Project Browser--
              1. Eigentlich müßte es sich auf das Zwischenergebnis beziehen macht es aber nicht. Weil wenn ich last() ausgabe kommt 4 (anzahl der schichte) raus und 2 (Anzahl) der Knoten.

                Steffen

                1. Hallo,

                  Eigentlich müßte es sich auf das Zwischenergebnis beziehen macht es aber nicht.

                  Ich habe jetzt nix zum testen da, ich glaube aber trotzdem, daß du auf dem Holzweg bist: ich denke position() bezieht sich _nicht_ auf das Zwischenergebnis.
                  Ich glaube ich bin schon an einer ähnlichen Problematik gescheitert und mußte da einen Umweg gehen.

                  bydey

                  --
                  -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
                  -- Navigate all your PHP web projects with  PHP Project Browser--
                  1. Und welchen Umweg?

                    danke

                    1. Ein wenig weiter bin ich:

                      <xsl:for-each select="//descendant::*[contains(local-name(), 'Name')]/bgs:Daten[position()  &lt; ($anzahl_layer)-($positionsnummer)]">

                      <xsl:sort select="count(ort)" order="ascending" />

                      <xsl:if test="position() = last() ">

                      <xsl:value-of select="ort"/>
                      </xsl:if>
                      </xsl:for-each>

                      Aber warum bezieht er die sort anweisung auf das gesamte dokument und nicht auf die for-each anweisung???

          2. Hallo,

            <xsl:when test="not (boolean(ort))">
                    <xsl:for-each select="//descendant::*[contains(local-name(), 'Name')]/bgs:Daten[position()  &lt; ($anzahl_layer)-($positionsnummer)]">
                     <xsl:if test="position() = last() ">
                     <xsl:value-of select="ort"/>

            </xsl:if>
                     </xsl:for-each>
                     </xsl:when>

            Was außer dir wohl noch niemend verstanden hat ist, was das for-each soll. Am Anfang sagst du du willst einen Treffer (den ersten) Anzeigen, filterst aber mit position() <5 vier Treffer aus. Danach versuchst du es mit position() = last(), was immerhin nur einen Treffer bringen sollte, sofern es denn eine Übereinstimmung gibt, aber den letzten.
            Warum nicht so
            <xsl:value-of select="//descendant::*[contains(local-name(), 'Name')]/bgs:Daten[position()  &lt; ($anzahl_layer)-($positionsnummer)]/ort">
            Dies sollte nur einen, den ertsen, Treffer anzeigen.
            Wobei hier value-of select mglicherweise nicht zum Kind-Element Ort paßt. Dann mußt du den Pfad ein wenig anpassen. Ohne dein XML ist das aber für mich nicht genauer zu sehen.

            bydey

            --
            -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
            -- Navigate all your PHP web projects with  PHP Project Browser--
  2. Moin!

    Also ich habe nicht verstanden, was Du überhaupt willst. Kannst Du nicht mal den relevanten Teil aus Deinem XML posten und schreiben, was Du davon ausgegeben haben willst?

    Was mich am meisten verwirrt ist Dein XPATH Ausdruck "//descendant::*..." Der findet, wenn ich das richtig verstanden habe, jegliches Kind im gesamten XML und nicht nur die Kinder des aktuellen. Willst Du das wirklich?

    -- Skeeve