Andi: Rekursives Template, Minimum bestimmen

Hallo,

ich versuche gerade GML3 Modelle mit XSLT umzuwandeln.
Ich habe ein Problem mit der Ermittlung eines Mittelwertes, was eigentlich nicht so schwer sein sollte. Meine Daten sehen wie folgt aus:

<gml>3569875,45 5896534,23</gml>
<gml>3552365,56 583256975,56</gml>

Nun möchte ich den Mittelwert der Koordinaten vor dem Leerzeichen und den Mittelwert für Koordinaten nach dem Leerzeichen. Ich habe es mit einem rekursiven Template versucht und die Knoten formatiert, dass ich nur einen Teilstring auslese. Verwendet habe ich die substring- before. Allerdings war meine Ausgabe leer.

Mein xslt- stylesheet sieht so aus:

<xsl:template name="minimum_x">
  <xsl:param name="Knoten" />
  <xsl:param name="min_temp" select="0"/>
     xsl:choose
        <xsl:when test="$Knoten" >
         <xsl:variable name="min-soweit">
           <xsl:call-template name="minimum_x">
             <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
             <xsl:with-param name="min_temp"
select="substring-before($Knoten[1],'
')"/>
          </xsl:call-template>
        </xsl:variable>
        xsl:choose
          <xsl:when test="$min-soweit &lt; .">
            <xsl:value-of select="$min-soweit" />
          </xsl:when>
          xsl:otherwise
            <xsl:value-of select="." />
          </xsl:otherwise>
        </xsl:choose>
     </xsl:when>
  </xsl:choose>
</xsl:template>

Das Template rufe ich über call-template mit Parametern auf.  Für andere Berechnungen bekomme ich Ergebnisse, nur bei der Verwendung der Substring fUnktion bekomme ich eine leere Ausgabe.

Beste Grüße

andi

  1. Hallo,

    »

    <xsl:template name="minimum_x">
      <xsl:param name="Knoten" />

    <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
                 <xsl:with-param name="min_temp"
    select="substring-before($Knoten[1],'
    ')"/>

    Was selektierst du beim Aufruf des Templates als $Knoten?
    Wenn es ein Knotenset ist, greift das Template nicht, denn die Position wird dann immer 1 sein.

    Grüße
    Thomas

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. Hallo,

      »

      <xsl:template name="minimum_x">
        <xsl:param name="Knoten" />

      <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
                   <xsl:with-param name="min_temp"
      select="substring-before($Knoten[1],'
      ')"/>

      Was selektierst du beim Aufruf des Templates als $Knoten?
      Wenn es ein Knotenset ist, greift das Template nicht, denn die Position wird dann immer 1 sein.

      Hi Thomas,

      ich wähle über

      <xsl:with-param name="nodes" select="xplan:position/gml:Polygon/gml:exterior/gml:LinearRing/gml:pos"/>

      Knoten aus. Allerdings habe ich so schon einmal den Schwerepunkt berechnet. Da funktionierts.
      Wird nicht immer das nächste Element genommen und dann wieder das Template aufgerufen und am Ende immer verglichen, ob der aktuelle Wert kleiner ist als der zuvor?

      Grüße
      Thomas

      1. Hallo,

        <xsl:template name="minimum_x">
          <xsl:param name="Knoten" />

        <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
                     <xsl:with-param name="min_temp"
        select="substring-before($Knoten[1],'
        ')"/>

        Was mit jetzt aufgefallen ist (und ich weiss jetzt nicht ob das nur hier im Forum so steht oder bei dir auch)

        Im substring-before($Knoten[1],'') hast du kein Leerzeichen im zweiten Argument, also so: substring-before($Knoten[1],' ')

        (das mit <xsl:with-param name="nodes"> statt "Knoten" ist wohl ein Tippfehler?))

        Wenn ich jetzt das Template:
        <xsl:template name="minimum_x">
          <xsl:param name="Knoten" />
          <xsl:param name="min_temp" select="0"/>
          <xsl:if test="$Knoten">
           <xsl:variable name="min-soweit">
            <xsl:call-template name="minimum_x">
             <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
             <xsl:with-param name="min_temp" select="substring-before($Knoten[1],' ')"/>
            </xsl:call-template>
           </xsl:variable>
           xsl:choose
            <xsl:when test="$min-soweit &lt; .">
             <xsl:value-of select="$min-soweit" />
            </xsl:when>
            xsl:otherwise
             <xsl:value-of select="." />
            </xsl:otherwise>
           </xsl:choose>
          </xsl:if>
        </xsl:template>

        auf

        <data>
        <testdata>
          <gml>3569875,45 5896534,23</gml>
          <gml>3552365,56 583256975,56</gml>
        </testdata>
        </data>

        mit

        <xsl:call-template name="minimum_x">
             <xsl:with-param name="Knoten" select="/data/testdata/gml"/>
            </xsl:call-template>

        anwende, bekomme ich als Ausgabe:
        3569875,45 5896534,23
        3552365,56 583256975,56

        Was mir eigentlich unklar ist, was du in der Variable "min-soweit" erreichen möchtest.
        Außerdem, du muss bedenken, dass ein Komma als Dezimaltrenner in XSLT nicht funktioniert. Deshalb wird ein "$min-soweit &lt; ." nie wahr werden.

        Grüße
        Thomas

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
        1. Hallo,

          Hallo,

          <xsl:template name="minimum_x">
            <xsl:param name="Knoten" />

          <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
                       <xsl:with-param name="min_temp"
          select="substring-before($Knoten[1],'
          ')"/>

          Was mit jetzt aufgefallen ist (und ich weiss jetzt nicht ob das nur hier im Forum so steht oder bei dir auch)

          bei mir im Code ist ein Leerzeichen und mit "nodes" anstelle von "Knoten" war ein Tippfehler. Hatte das aus einer alten Version herauskopiert.

          Im substring-before($Knoten[1],'') hast du kein Leerzeichen im zweiten Argument, also so: substring-before($Knoten[1],' ')

          (das mit <xsl:with-param name="nodes"> statt "Knoten" ist wohl ein Tippfehler?))

          Wenn ich jetzt das Template:
          <xsl:template name="minimum_x">
            <xsl:param name="Knoten" />
            <xsl:param name="min_temp" select="0"/>
            <xsl:if test="$Knoten">
             <xsl:variable name="min-soweit">
              <xsl:call-template name="minimum_x">
               <xsl:with-param name="Knoten" select="$Knoten[position() != 1]" />
               <xsl:with-param name="min_temp" select="substring-before($Knoten[1],' ')"/>
              </xsl:call-template>
             </xsl:variable>
             xsl:choose
              <xsl:when test="$min-soweit &lt; .">
               <xsl:value-of select="$min-soweit" />
              </xsl:when>
              xsl:otherwise
               <xsl:value-of select="." />
              </xsl:otherwise>
             </xsl:choose>
            </xsl:if>
          </xsl:template>

          auf

          <data>
          <testdata>
            <gml>3569875,45 5896534,23</gml>
            <gml>3552365,56 583256975,56</gml>
          </testdata>
          </data>

          mit

          <xsl:call-template name="minimum_x">
               <xsl:with-param name="Knoten" select="/data/testdata/gml"/>
              </xsl:call-template>

          anwende, bekomme ich als Ausgabe:
          3569875,45 5896534,23
          3552365,56 583256975,56

          Was mir eigentlich unklar ist, was du in der Variable "min-soweit" erreichen möchtest.
          Außerdem, du muss bedenken, dass ein Komma als Dezimaltrenner in XSLT nicht funktioniert. Deshalb wird ein "$min-soweit &lt; ." nie wahr werden.

          Min-soweit sollte wie eine temporale Varibale sein, damit ich den minimalen Wert der Koordinaten herausbekomme (also in diesem Fall 3552365,56). Ich möchte von einer Fläche den Mittelpunkt bestimmen. Daher benötige ich jeweils den Minimal- und Maximalwert von den 2 Werten mit der vornestehenden 3 und dasselbe für die Werte mit der 5 vorne.
          Das Komma als Trennzeichen ist in meinen Daten ein Punkt. Das sollte ja funktionieren.

          Aber ich glaub das Problem ist, das er immer alle Werte ausgibt und nicht nur den Minimalwert. Denn ich habe auch schon öfters Ausgaben bekommen, was alle Daten des XML- Dokumetes beinhaltet.

          Beste Grüße
          andi

          Grüße
          Thomas

          1. Hallo,

            Was mir eigentlich unklar ist, was du in der Variable "min-soweit" erreichen möchtest.
            Außerdem, du muss bedenken, dass ein Komma als Dezimaltrenner in XSLT nicht funktioniert. Deshalb wird ein "$min-soweit &lt; ." nie wahr werden.

            Min-soweit sollte wie eine temporale Varibale sein, damit ich den minimalen Wert der Koordinaten herausbekomme (also in diesem Fall 3552365,56). Ich möchte von einer Fläche den Mittelpunkt bestimmen. Daher benötige ich jeweils den Minimal- und Maximalwert von den 2 Werten mit der vornestehenden 3 und dasselbe für die Werte mit der 5 vorne.
            Das Komma als Trennzeichen ist in meinen Daten ein Punkt. Das sollte ja funktionieren.

            Aber ich glaub das Problem ist, das er immer alle Werte ausgibt und nicht nur den Minimalwert. Denn ich habe auch schon öfters Ausgaben bekommen, was alle Daten des XML- Dokumetes beinhaltet.

            angewendet auf diese Datei:
            <data>
            <testdata>
              <gml>3569875.45 5896534.23</gml>
              <gml>3552365.56 583256975.56</gml>
            </testdata>
            </data>

            mit
            <xsl:call-template name="minimum_x">
                  <xsl:with-param name="Knoten" select="/data/testdata/gml"/>
                 </xsl:call-template>

            und:

            <xsl:template name="minimum_x">
              <xsl:param name="Knoten" />
              <xsl:if test="$Knoten">
               <xsl:variable name="min-soweit">
                <xsl:for-each select="$Knoten">
                 <xsl:sort select="substring-before(.,' ')" data-type="number" order="ascending" />
                 <xsl:if test="position() = 1">
                  <xsl:value-of select="number(substring-before(.,' '))" />
                 </xsl:if>
                </xsl:for-each>
               </xsl:variable>
               <h4>min-soweit: <xsl:value-of select="$min-soweit" /></h4>
               <!-- xsl:choose
                <xsl:when test="$min-soweit &lt; number(substring-before(.,' '))">
                 <strong>min-soweit &lt;:</strong><xsl:value-of select="$min-soweit" />
                </xsl:when>
                xsl:otherwise
                 <strong>substring-before():</strong><xsl:value-of select="substring-before(.,' ')" />
                </xsl:otherwise>
               </xsl:choose> -->
              </xsl:if>
            </xsl:template>

            bekommst du das kleinste Wert, also in diesem Fall "3552365.56".
            Allerdings: Saxon (7 bzw. 8) liefert hier ein "3.55236556E6" also ein Fließkommazahl, der MSXML und der XSL-Proz. von Oxygen liefern "3552365.56".
            (Für den Vergleich ist es eigentlich egal)

            Denn du den auskommentierten Teil wieder einkommentierst liefern die versch. Prozessoren wiederum versch. Ergebnisse (diesmal ist der MSXML der ausreißer).

            Es ist jetzt also dir, wie und wo du das Template aufrufst, bzw. was du noch in der jetzt auskommentierten Stelle dann machst.

            Ich würde das Template in einem Variable im "eigentlichen Tempalte aufrufen:
            <xsl:variable name="minimum_blabla">
                 <xsl:call-template name="minimum_x">
                  <xsl:with-param name="Knoten" select="/data/testdata/gml"/>
                 </xsl:call-template>
                </xsl:variable>

            und dann mit dem Wert den Vergleich machen (also das was jetzt im auskommentierten Teil steht).

            Grüße
            Thomas

            --
            Surftip: kennen Sie schon Pipolino's Clowntheater?
            http://www.clowntheater-pipolino.net/
  2. Hi,

    Ich habe ein Problem mit der Ermittlung eines Mittelwertes, was eigentlich nicht so schwer sein sollte. Meine Daten sehen wie folgt aus:
    <gml>3569875,45 5896534,23</gml>
    <gml>3552365,56 583256975,56</gml>

    Hm. Anmerkung am Rande:

    Da erscheint _mir_ die XML-Struktur suboptimal - ich würde die Werte einerseits mit . statt , schreiben (weil's halt in Computersprachen üblicher ist) und andererseits entweder in 2 Attributen des gml-Elements oder in 2 Kindelementen (z.B. mit Namen x und y) unterbringen. Damit wären die Werte direkt - ohne substring-Zeug - greifbar.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo,

      Hm. Anmerkung am Rande:

      Da erscheint _mir_ die XML-Struktur suboptimal - ich würde die Werte einerseits mit . statt , schreiben (weil's halt in Computersprachen üblicher ist) und andererseits entweder in 2 Attributen des gml-Elements oder in 2 Kindelementen (z.B. mit Namen x und y) unterbringen. Damit wären die Werte direkt - ohne substring-Zeug - greifbar.

      Die Struktur kann er nicht ändern, da es um GML3 (Geography Markup Language) http://www.opengeospatial.org/specs/?page=specs geht.
      Ah ja, die Webseite ist extermst nervtötend, fast alle Links öffen ein neues Fenste, nichts als PDF etc. Wirklich *iggit*.

      Grüße
      Thomas

      --
      Surftip: kennen Sie schon Pipolino's Clowntheater?
      http://www.clowntheater-pipolino.net/
      1. Hi,

        Die Struktur kann er nicht ändern, da es um GML3 (Geography Markup Language) http://www.opengeospatial.org/specs/?page=specs geht.

        Kannte ich nicht.

        Ah ja, die Webseite ist extermst nervtötend, fast alle Links öffen ein neues Fenste, nichts als PDF etc. Wirklich *iggit*.

        Die paßt also zu GML3 - ziemlich undurchdacht ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      2. Hallo,

        Hm. Anmerkung am Rande:

        Da erscheint _mir_ die XML-Struktur suboptimal - ich würde die Werte einerseits mit . statt , schreiben (weil's halt in Computersprachen üblicher ist) und andererseits entweder in 2 Attributen des gml-Elements oder in 2 Kindelementen (z.B. mit Namen x und y) unterbringen. Damit wären die Werte direkt - ohne substring-Zeug - greifbar.

        Die Struktur kann er nicht ändern, da es um GML3 (Geography Markup Language) http://www.opengeospatial.org/specs/?page=specs geht.
        Ah ja, die Webseite ist extermst nervtötend, fast alle Links öffen ein neues Fenste, nichts als PDF etc. Wirklich *iggit*.

        Hi Thomas,

        besten Dank nochmal für deine Hilfe. Jetzt klappts. Kurz noch ne Frage: Mit nem rekursiven Template würde es doch prinzipiell auch klappen, oder?

        Beste Grüße

        andi

        Grüße
        Thomas

        1. Hallo,

          besten Dank nochmal für deine Hilfe. Jetzt klappts. Kurz noch ne Frage: Mit nem rekursiven Template würde es doch prinzipiell auch klappen, oder?

          Ja, aber ohne genau Kentnisse deines XMLs und ohne den Kontext zu kennen in dem du das Template bzw. die Rekursion anwenden möchtest, konnte ich nur diese Variante ausarbeiten. (Was nebenbei nicht so schlecht ist, denn du kannst auf diese Weise andere max. und min. Nummernierungen "ausrechnen".)

          Grüße
          Thomas

          --
          Surftip: kennen Sie schon Pipolino's Clowntheater?
          http://www.clowntheater-pipolino.net/
          1. Hallo,

            besten Dank nochmal für deine Hilfe. Jetzt klappts. Kurz noch ne Frage: Mit nem rekursiven Template würde es doch prinzipiell auch klappen, oder?

            Ja, aber ohne genau Kentnisse deines XMLs und ohne den Kontext zu kennen in dem du das Template bzw. die Rekursion anwenden möchtest, konnte ich nur diese Variante ausarbeiten. (Was nebenbei nicht so schlecht ist, denn du kannst auf diese Weise andere max. und min. Nummernierungen "ausrechnen".)

            OK, das stimmt.
            Vom Prinzip sind meine Objekte immer so aufgebaut:

            xplan:BPlanAuszug
            wfs:FeatureCollection
            gml:featureMember
               <xplan:BaugebietsFlaechenTeil gml:id="obj_175">
                xplan:position
                 gml:Polygon
                  gml:exterior
                   gml:LinearRing
                    gml:pos3480252.383 5889479.27</gml:pos>
                    gml:pos3480289.585 5889464.571</gml:pos>
                    gml:pos3480267.599 5889409.03</gml:pos>
                    gml:pos3480266.38776072 5889406.3197261328</gml:pos>
                    gml:pos3480252.383 5889479.27</gml:pos>
                   </gml:LinearRing>
                  </gml:exterior>
                 </gml:Polygon>
                </xplan:position>

            </xplan:BaugebietsFlaechenTeil>
              </gml:featureMember>

            </wfs:FeatureCollection>
            </xplan:BPlanAuszug>

            Die Objekte, welche dargestellt werden sollen, sind alle so aufgebaut und werden selbst innerhalb des SVG- Teils über das mode- Attribut aufgerufen:

            <xsl:template match="xplan:BPlanAuszug/wfs:FeatureCollection/gml:featureMember/xplan:BaugebietsFlaechenTeil" mode="Ebene03">

            Das Modeattribut regelt die Zeichenebene. Es ändert sich immer nur der letzte Teil des Pfades. Da die Objekte von der Struktur alle gleich aufgebaut sind kann ich den Pfad für die einzelnen Objekte mit

            <xsl:call-template name="create_polygon">

            generieren. Die Koordinaten werden innerhlab des create_polygon Templates ausgelesen, indem wieder ein call-template angewendet wird. Der Kontext für alle weiteren Verarbeitungen liegt also hier auf xplan:BaugebietsFlaechenTeil.
            Anwenden möchte ich das Ganze auf Objekte (Flächen), die eine Zusatzinformation haben (in Form eines textlichen Kürzels). Dieses Kürzel wird dann in den Mittelpunkt der Fläche gesetzt.

            Beste Grüße

            andi

            Grüße
            Thomas

            1. Hallo,

              Die Objekte, welche dargestellt werden sollen, sind alle so aufgebaut und werden selbst innerhalb des SVG- Teils über das mode- Attribut aufgerufen:

              <xsl:template match="xplan:BPlanAuszug/wfs:FeatureCollection/gml:featureMember/xplan:BaugebietsFlaechenTeil" mode="Ebene03">

              Das Modeattribut regelt die Zeichenebene.

              Was bedeutet das? (Heisst das, dass (hier) von den 5 gml:pos z.B. nur die ersten drei in die Berechnung herangezogen werden sollen?)
              Damit ich es richtig verstehe:
              Du hast eine bestimmte(?) anzahl von gml:pos Elementen.
              Da möchtest du herausfinden welches x-Wert (substring-befor) das mittlere ist?
              Also von diesen Werten das Mittelre herausfinden? (das wäre dann hier entweder *67.5* oder *89.5*, das wäre natürlich etwas schwierig)
              3480252.383
              3480289.585
              3480267.599
              3480266.38776072
              Wenn es nur jeweils die ersten drei Elemente zählen sollten, ist das dann leichter.
              Aber jetzt verstehe ich warum du das mit einem recursiven Template machen wolltest: du möchtest bei jeden Konten den ersten Teil mit dem minimum vergleichen. Nur was soll als Ausgabe kommen: ein Wert oder mehrere Werte?

              Grüße
              Thomas

              --
              Surftip: kennen Sie schon Pipolino's Clowntheater?
              http://www.clowntheater-pipolino.net/
              1. Hallo,

                Die Objekte, welche dargestellt werden sollen, sind alle so aufgebaut und werden selbst innerhalb des SVG- Teils über das mode- Attribut aufgerufen:

                <xsl:template match="xplan:BPlanAuszug/wfs:FeatureCollection/gml:featureMember/xplan:BaugebietsFlaechenTeil" mode="Ebene03">

                Das Modeattribut regelt die Zeichenebene.

                Was bedeutet das? (Heisst das, dass (hier) von den 5 gml:pos z.B. nur die ersten drei in die Berechnung herangezogen werden sollen?)

                Es soll von den 5 Werten hier der kleinste Wert herausgesucht werden, wie es ja in dem Template gemacht wird, das du mir geschickt hattest. Also in diesem Fall 3480252.383. Für die Werte mit der 5 vorne wird das gleiche gemacht. Ich rufe das Template oben innerhalb des Blockes auf, wo ich das SVG erzeuge. Ich nutze das Modeattribut nur, um einfach meine Objekte irgendwo an einem Punkt im XSLT- File gebündelt zu definieren können. Ich muss dann nicht darauf achten, in welcher Reihenfolge ich das mache. Jedes Objekt hat dann ein mode attribut und im SVG sieht es wie folgt aus:

                <xsl:apply-templates mode="Ebene01"/>
                <xsl:apply-templates mode="Ebene02"/>
                <xsl:apply-templates mode="Ebene03"/>
                <xsl:apply-templates mode="Ebene04"/>
                <xsl:apply-templates mode="Ebene05"/>

                So werden erst Elemente mit modeattribut = Ebene01 gezeichnet und so weiter.

                Damit ich es richtig verstehe:
                Du hast eine bestimmte(?) anzahl von gml:pos Elementen.
                Da möchtest du herausfinden welches x-Wert (substring-befor) das mittlere ist?

                Die Anzahl der Elemente ist beliebig und ich benötige Minmal und Maximalwert für x und y. Also für jeweils für Werte vor und nach dem Leerzeichen.

                Also von diesen Werten das Mittelre herausfinden? (das wäre dann hier entweder *67.5* oder *89.5*, das wäre natürlich etwas schwierig)
                3480252.383
                3480289.585
                3480267.599
                3480266.38776072
                Wenn es nur jeweils die ersten drei Elemente zählen sollten, ist das dann leichter.
                Aber jetzt verstehe ich warum du das mit einem recursiven Template machen wolltest: du möchtest bei jeden Konten den ersten Teil mit dem minimum vergleichen. Nur was soll als Ausgabe kommen: ein Wert oder mehrere Werte?

                Ein Wert soll herauskommen. Ich hatte gedacht, dass man immer einen Knoten nimmt und den mit dem nächsten oder ähnlich vergleicht, um so den Minimalwert zu bekommen. Das ist glaub eleganter als das Andere. Wobei mir damit auch schon sehr geholfen ist :-)

                Beste Grüße
                andi

                Grüße
                Thomas

                1. Hallo,

                  Die Anzahl der Elemente ist beliebig und ich benötige Minmal und Maximalwert für x und y. Also für jeweils für Werte vor und nach dem Leerzeichen.

                  Insgesamt also vier werte: dann wirst du um so was nicht herumkommen (analog dann für minimumY und maximumY mit substring-after()):
                  <xsl:template name="minimumX">
                    <xsl:param name="Knoten" />
                    <xsl:variable name="minimum">
                     <xsl:if test="$Knoten">
                      <xsl:for-each select="$Knoten">
                       <xsl:sort select="substring-before(.,' ')" data-type="number" />
                       <xsl:if test="position() = 1">
                        <xsl:value-of select="number(substring-before(.,' '))" />
                       </xsl:if>
                      </xsl:for-each>
                     </xsl:if>
                    </xsl:variable>
                    <xsl:value-of select="$minimum" />
                  </xsl:template>

                  <xsl:template name="maximumX">
                    <xsl:param name="Knoten" />
                    <xsl:variable name="maximum">
                     <xsl:if test="$Knoten">
                      <xsl:for-each select="$Knoten">
                       <xsl:sort select="substring-before(.,' ')" data-type="number" order="descending" />
                       <xsl:if test="position() = 1">
                        <xsl:value-of select="number(substring-before(.,' '))" />
                       </xsl:if>
                      </xsl:for-each>
                     </xsl:if>
                    </xsl:variable>
                    <xsl:value-of select="$maximum" />
                  </xsl:template>

                  Dann ob nun in einer Variable oder in einem xsl:attribut deas entsprechenden Tempalte aufrufen:
                  <xsl:call-template name="minimumX">
                        <xsl:with-param name="Knoten" select="xplan:BPlanAuszug//gml:pos"/>
                       </xsl:call-template>

                  Ein Wert soll herauskommen. Ich hatte gedacht, dass man immer einen Knoten nimmt und den mit dem nächsten oder ähnlich vergleicht, um so den Minimalwert zu bekommen. Das ist glaub eleganter als das Andere. Wobei mir damit auch schon sehr geholfen ist :-)

                  Nein das ist nicht wirklich eleganter und vor allem in diesem fall auch nicht nötig und wäre auch viel weniger performanter. Recursion sollte man nur anwenden, wenn es wirklich nötig ist ;-)

                  Grüße
                  Thomas

                  --
                  Surftip: kennen Sie schon Pipolino's Clowntheater?
                  http://www.clowntheater-pipolino.net/
                  1. Hallo,

                    Die Anzahl der Elemente ist beliebig und ich benötige Minmal und Maximalwert für x und y. Also für jeweils für Werte vor und nach dem Leerzeichen.

                    Insgesamt also vier werte: dann wirst du um so was nicht herumkommen (analog dann für minimumY und maximumY mit substring-after()):
                    <xsl:template name="minimumX">
                      <xsl:param name="Knoten" />
                      <xsl:variable name="minimum">
                       <xsl:if test="$Knoten">
                        <xsl:for-each select="$Knoten">
                         <xsl:sort select="substring-before(.,' ')" data-type="number" />
                         <xsl:if test="position() = 1">
                          <xsl:value-of select="number(substring-before(.,' '))" />
                         </xsl:if>
                        </xsl:for-each>
                       </xsl:if>
                      </xsl:variable>
                      <xsl:value-of select="$minimum" />
                    </xsl:template>

                    <xsl:template name="maximumX">
                      <xsl:param name="Knoten" />
                      <xsl:variable name="maximum">
                       <xsl:if test="$Knoten">
                        <xsl:for-each select="$Knoten">
                         <xsl:sort select="substring-before(.,' ')" data-type="number" order="descending" />
                         <xsl:if test="position() = 1">
                          <xsl:value-of select="number(substring-before(.,' '))" />
                         </xsl:if>
                        </xsl:for-each>
                       </xsl:if>
                      </xsl:variable>
                      <xsl:value-of select="$maximum" />
                    </xsl:template>

                    Dann ob nun in einer Variable oder in einem xsl:attribut deas entsprechenden Tempalte aufrufen:
                    <xsl:call-template name="minimumX">
                          <xsl:with-param name="Knoten" select="xplan:BPlanAuszug//gml:pos"/>
                         </xsl:call-template>

                    Ein Wert soll herauskommen. Ich hatte gedacht, dass man immer einen Knoten nimmt und den mit dem nächsten oder ähnlich vergleicht, um so den Minimalwert zu bekommen. Das ist glaub eleganter als das Andere. Wobei mir damit auch schon sehr geholfen ist :-)

                    Nein das ist nicht wirklich eleganter und vor allem in diesem fall auch nicht nötig und wäre auch viel weniger performanter. Recursion sollte man nur anwenden, wenn es wirklich nötig ist ;-)

                    okidok,

                    besten Dank nochmal! Habe jetzt ne Ausgabe mit Symbolen in der Mitte meiner Flächen. So wie ich es wollte. Glaube mehr kann man nicht erreichen. Manchmal liegt halt bei ungleichen Flächen der Mittelpunkt außerhalb der Fläche. Denke da muss man mit C++ oder so ran.

                    Beste Grüße
                    andi

                    Grüße
                    Thomas