Markus B.: Variabeln zusammenfassen, --> Unexpected tocken....

<xsl:variable name="Lgth" select="count(/data/Intervall)"> </xsl:variable>
    <xsl:variable name="LgthEch2" select="count(/data/Intervall/value)"/>
    <xsl:variable name="Share" select="{(80/$Lgth/)$LgthEch2}"></xsl:variable>

Dieser Cod funktioniert nicht, egal ob geschweifte oder nur runde klammer...

W [Saxon6.5.5] Invalid character ({) in expression {(80/$Lgth/)$LgthEch2}

IHc verstehe net warum

  1. <xsl:variable name="Lgth" select="count(/data/Intervall)"> </xsl:variable>
        <xsl:variable name="LgthEch2" select="count(/data/Intervall/value)"/>
        <xsl:variable name="Share" select="{(80/$Lgth/)$LgthEch2}"></xsl:variable>

    Dieser Cod funktioniert nicht, egal ob geschweifte oder nur runde klammer...

    W [Saxon6.5.5] Invalid character ({) in expression {(80/$Lgth/)$LgthEch2}

    IHc verstehe net warum

    Weil: " { "

    aber auch sonst ist das komisch was du machst

    count(/data/Intervall) z.B. = 5
    count(/data/Intervall/value) z.B. = 10

    $Share wäre demnach: "80/5/10" und das als Pfadangabe!?!?
    Hast du denn echt Elemente in deinem XML die <80>, <5> und <10> heissen?

    Grüße
    Thomas

    1. Eig. dachte ich damit, dass Ich 80 durch dir variable $Lgth teile und dann
      durch die Variable $LgthEch2 und dies in einer neuen Variabel
      zusammenfassen.

      Wie muss ich dass denn sonst machen?

      Btw:

      Ich bin jetzt in einem template mit einer choose anweisung und dann möchte
       ich einen Zähler hochzählen.

      ICH hatte schon an an call template teil gedacht (rekursiv?) aber da habe
      ihc eine dauerschleife.

      COde hier:

      <xsl:template match="value" name="Temp1">

      xsl:choose
                  <!-- teste auf vorhandene folgewert in gleichen knoten -->
                  <xsl:when test="following-sibling::value[position() = 1]">
                          <text x1="Hier sol zähler am ende drinne stehen" y1="{.}" x2="und hier auch " y2="{following-sibling::value[position() = 1]}"/>

      </xsl:when>

      xsl:otherwise
                      <!-- teste auf letzen wert, wenn true keine ausgabe -->
                      <xsl:if test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">
                          <text y1="{.}" y2="{parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]}"/></xsl:if>
                  </xsl:otherwise>

      </xsl:choose>

      </xsl:template>

      1. Hallo,

        Eig. dachte ich damit, dass Ich 80 durch dir variable $Lgth teile und dann
        durch die Variable $LgthEch2 und dies in einer neuen Variabel
        zusammenfassen.

        Ich dachte, dass du das dachtest ;-)

        Wie muss ich dass denn sonst machen?

        Richtig? (mit (x div y))
        http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm#operatoren

        ICH hatte schon an an call template teil gedacht (rekursiv?) aber da habe
        ihc eine dauerschleife.

        Dann läuft etwas schief.

        COde hier:

        Der sagt mir so nichts.

        Grüße
        Thomas

        1. Wie muss ich dass denn sonst machen?

          Richtig? (mit (x div y))
          http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm#operatoren

          OMG, darauf hätte ich auhc selber kommen können^^Trozdem danke

          ICH hatte schon an an call template teil gedacht (rekursiv?) aber da habe
          ihc eine dauerschleife.

          Dann läuft etwas schief.

          ok  hier:

          <xsl:template match="value" name="Temp1">
                    <xsl:param name="add" select="0"/>

          xsl:choose

          <xsl:when test="following-sibling::value[position() = 1]">
                              <text x1="add" y1="{.}" x2=" add " y2="{following-sibling::value[position() = 1]}"/>

          </xsl:when>

          xsl:otherwise

          <xsl:if test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">

          <text x1="add" y1="{.}" x2="add"

          y2="{parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]}"/></xsl:if>
                      </xsl:otherwise>

          </xsl:choose>

          Dann dachte ich das so zu machen

          <xsl:when test="...">
                              <text x1="add" ...>

          <xsl:call-template name="Temp1">
          <xsl:with-param name="add" select="$add+1"/>
          </xsl:call-template>

          </xsl:when>

          Da komtm eine dauerschleife.

          Ausgabe wäre:

          <text x1="" y1="100" x2="" y2="124"/>
          <text x1="" y1="100" x2="" y2="124"/>
          <text x1="" y1="100" x2="" y2="124"/>
          ...

          Sonst hatte ihc keine weiter idee..

          1. Kann mir keiner helfen?

            Markus

            1. Hallo,

              Kann mir keiner helfen?

              Doch, ich könnte und würde aber :

              1)ich hocke nicht vor dem Rechner und warte darauf, dass hier jemand was fragt.

              1. ich habe dir schon gesagt, dass ich mit dem XSLT an sich nichts anfangen kann (ohne das XML [gut _das_ habe ich nicht dazugesagt]). Woher soll ich deine Endlosschleife reproduzieren? Soll etwa ich dazu selbst ein XML erstellen!? Soll ich die Daten aus deinen Gedanken auslesen? Alles in meiner eigenen (frei)Zeit!?

              2. Irgendwo hast du schon ein XML gepostet, ABER ich habe überhaupt keine Lust alle deine Postings im Archiv! und in der Hauptdatei des Forum auszusuchen und durchzulesen (die Zeit, in der ich das machen würde, ist die Zeit, die ich für die Lösung deines Problems hätte verwenden können) Zudem hat sich dein XML möglicherweise seit damals drei mal geändert, denn dieser Code ist sicher nicht das, was du jetzt hast.

              3. ich glaube dir, dass dir dein Problem sehr relevant ist und dass es dir quasi ständig vor Augen liegt, aber z.B. mir ist es weder relevant noch habe alle Sachen vor Augen, so dass wenn du mir nicht Hilfst, damit ich dir helfen kann, kann dir keiner helfen.

              Grüße
              Thomas

              1. Hallo,

                Kann mir keiner helfen?

                Doch, ich könnte und würde aber :

                1)ich hocke nicht vor dem Rechner und warte darauf, dass hier jemand was fragt.

                Akkzeptiert^^Mein Fehler

                Dann stell ihc hier mal kurz alles für diese Problem dar:

                So hier die XSL(Relevante teil):

                <xsl:apply-templates select="Intervall"/>

                </svg>
                    </xsl:template>
                    <xsl:template match="value" name="Temp1">
                        <xsl:param name="add" select="0"/>

                <xsl:param name="add2" select="$add+1"/>
                        <xsl:for-each select="descendant-or-self::value">
                            xsl:choose

                <xsl:when test="following-sibling::value[position() = 1]">
                                    <g class="Lines1">
                                        <line x1="{$add}%" y1="{76-((0.6*((100*(.)) div ($MaxV))))}%"
                                            x2="{$add+$add}%"
                                            y2="{76-(0.6*(100*(following-sibling::value[position() = 1])) div (($MaxV)))}%"
                                        />
                                    </g>
                                </xsl:when>

                xsl:otherwise
                                    <xsl:if
                                        test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">
                                        <g class="Lines1">
                                            <line x1="{$add}%"
                                                y1="{(76-((100*(.)) div (($MaxV)-100)-100) *0.6)}%" x2="{$add+$add}%"
                                                y2="{(76-((100*(parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1])) div (($MaxV)-100)-100) *0.6)}%"
                                            />
                                        </g>
                                    </xsl:if>

                </xsl:otherwise>

                </xsl:choose>

                </xsl:for-each>
                    </xsl:template>

                DIe XML(ein kleiner Teil, der Rest sieht aber genauso aus)

                hier

                <data>
                    <Intervall name="30.05.2003">
                        <value>100</value>
                        <value>105</value>
                        <value>110</value>
                        <value>115</value>
                    </Intervall>
                    <Intervall name="30.05.2001">
                        <value>120</value>
                        <value>125</value>
                        <value>130</value>
                        <value>135</value>
                    </Intervall>
                    <Intervall name="30.05.2005">
                        <value>140</value>
                        <value>145</value>
                        <value>150</value>
                        <value>155</value>
                    </Intervall>
                    <Intervall name="30.05.2006">
                        <value>160</value>
                        <value>165</value>
                        <value>170</value>
                        <value>175</value>
                    </Intervall>

                </data>

                Jetzt nochma zudem was ich machen möchte

                <xsl:when test="following-sibling::value[position() = 1]">
                                    <g class="Lines1">
                                        <line x1="{$add}%" y1="{76-((0.6*((100*(.)) div ($MaxV))))}%"
                                            x2="{$add*2}%"
                                            y2="{76-(0.6*(100*(following-sibling::value[position() = 1])) div (($MaxV)))}%"
                                        />
                                    </g>

                <-- Hier will ihc jetzt das Template wieder aufrufen und add um 1(bzw eine variable später) erhöhen und dass mach ihc auch im xsl:otherwise--->

                <xsl:call-template name="Temp1">
                <xsl:with-param name="add" select="$add+1"/>
                </xsl:call-template>

                </xsl:when>

                Das Problem hab ich im debuggen auch gefunden, er bleibt beim Aufrufen in der gleichen position und geht nicht zum nächten Value, wodruch er die Dauerschleife bekommt.

                ps: soll ich meine anderes problem/e auhc hier posten oder dafür einen neuen Thread aufmachen weil es dann besser zu sehen ist für andere Member?

                1. Hallo,

                  So hier die XSL(Relevante teil):

                  Wir kommen der Sache näher. Jetzt fehlen mir nur noch paar unwesentliche Teile wie Z.B. die Deklaration von und Wert von $MaxV. (ich denke nicht, dass das jetzt wirklich 16% (wie im anderen Posting steht) ist?)
                  Der Ort und Aufruf von Temp1, dein XSLT wird nicht so aussehen:

                  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
                   <xsl:template match="/data">  
                    <svg>  
                     <xsl:apply-templates select="Intervall" />  
                    </svg>  
                   </xsl:template>  
                   <xsl:template match="value" name="Temp1">  
                    ...  
                   </xsl:template>  
                  </xsl:stylesheet>
                  

                  ps: soll ich meine anderes problem/e auhc hier posten oder dafür einen neuen Thread aufmachen weil es dann besser zu sehen ist für andere Member?

                  Egal, hast eh schon ;-)
                  Auch nicht so verkehrt, weil die Frage dort ist eher einer der Mathematik als XSLT.

                  Grüße
                  Thomas

                  1. Dann stell ich einfachmal sogut wie das ganze rein, wird wohl am einfachsten sein.
                    Das mit dem Maxwert hast du falsch verstanden, der Max´wert soll immber bei x=5% und y =16% stehen in der Grafik

                      
                    <?xml version="1.0" encoding="UTF-8"?>  
                      
                    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"  
                        xmlns="http://www.w3.org/2000/svg">  
                      
                        <xsl:output method="xml" omit-xml-declaration="no" indent="yes" version="1.0"  
                            doctype-system="-//W3C//DTD SVG 1.1//EN"  
                            doctype-public="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"/>  
                        <xsl:variable name="Lgth" select="count(/data/Intervall)"> </xsl:variable>  
                        <xsl:variable name="LgthEch2" select="count(/data/Intervall/value)"/>  
                        <xsl:variable name="share" select="((90 div $Lgth) div ($LgthEch2 div $Lgth))"/>  
                        <xsl:variable name="MaxV">  
                            <xsl:for-each select=" descendant-or-self::value">  
                                <xsl:sort data-type="number" order="descending"/>  
                                <xsl:if test="position()=1">  
                                    <xsl:value-of select="."/>  
                                </xsl:if>  
                            </xsl:for-each>  
                        </xsl:variable>  
                        <!--      Einbinden der Css datei      -->  
                        <xsl:template match="/data">  
                            <xsl:processing-instruction name="xml-stylesheet">type="text/css"  
                                href="CSSpfad"</xsl:processing-instruction>  
                            <svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="50%" height="50%">  
                                <g class="Background-rect">  
                                    <rect width="100%" height="100%"/>  
                                </g>  
                                <g class="Num-left">  
                                    <text x="2%" y="16%">  
                                        <xsl:value-of select="$MaxV"/>  
                                    </text>  
                                    <text x="2%" y="31%">  
                                        <xsl:value-of select="ceiling((((($MaxV)-100) *(3 div 4))+100))"/>  
                                    </text>  
                                    <text x="2%" y="46%">  
                                        <xsl:value-of select="ceiling((((($MaxV)-100) *(2 div 4))+100))"/>  
                                    </text>  
                                    <text x="2%" y="61%">  
                                        <xsl:value-of select="ceiling((((($MaxV)-100) *(1 div 4))+100))"/>  
                                    </text>  
                                    <text x="2%" y="76%">  
                                        <xsl:value-of select="ceiling((((($MaxV)-100)*0) +100))"/>  
                                    </text>  
                                    <text x="2%" y="91%">  
                                        <xsl:value-of select="ceiling((ceiling(($MaxV)-100)*-1 div 4)+100)"/>  
                                    </text>  
                                </g>  
                                <g class="Lines2">  
                                    <line x1="5%" y1="90%" x2="95%" y2="90%"/>  
                      
                                </g>  
                                <g class="Lines3">  
                                    <line x1="5%" y1="15%" x2="95%" y2="15%"/>  
                                    <line x1="5%" y1="30%" x2="95%" y2="30%"/>  
                                    <line x1="5%" y1="45%" x2="95%" y2="45%"/>  
                                    <line x1="5%" y1="60%" x2="95%" y2="60%"/>  
                                    <line x1="5%" y1="75%" x2="95%" y2="75%"/>  
                                </g>  
                                <xsl:apply-templates select="Intervall"/>  
                            </svg>  
                        </xsl:template>  
                        <xsl:template match="value" name="Temp1">  
                            <xsl:param name="add" select="0"/>  
                            <xsl:for-each select="descendant-or-self::value">  
                                <xsl:choose>  
                      
                                    <xsl:when test="following-sibling::value[position() = 1]">  
                                        <g class="Lines1">  
                                            <line x1="{$add}%" y1="{.}%" x2="{$add+$add}%"  
                                                y2="{following-sibling::value[position() = 1]}%"/>  
                                        </g>  
                                        <xsl:call-template name="Temp1">  
                      
                          <xsl:with-param name="add" select="$add+$share"></xsl:with-param>  
                                        </xsl:call-template>  
                                    </xsl:when>  
                      
                                    <xsl:otherwise>  
                                        <xsl:if  
                                            test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">  
                                            <g class="Lines1">  
                                                <line x1="{$add}%" y1="{.}%" x2="{$add+2}%"  
                                                    y2="{parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]}%"  
                                                />  
                                            </g>  
                                            <xsl:call-template name="Temp1">  
                                                <xsl:with-param name="add" select="$add+$share"></xsl:with-param>  
                                            </xsl:call-template>  
                                        </xsl:if>  
                                    </xsl:otherwise>  
                                </xsl:choose>  
                            </xsl:for-each>  
                        </xsl:template>  
                    </xsl:stylesheet>  
                    
                    
                    1. Hallo,

                      Dann stell ich einfachmal sogut wie das ganze rein, wird wohl am einfachsten sein.

                      Ja.

                      So, warum du in eine Endlosschleife gefangen bleibst - du hast eingetlich gleich mehrere eingebaut - habe ich dein XSL zum Testen und Veranschaulichen verschlankt.

                      Wichtig, ich habe oben im XSLT ein <xsl:strip-space elements="Intervall"/> eingefügt!

                        
                       <xsl:template match="value" name="Temp1">  
                        <xsl:param name="add" select="0"/>  
                        <xsl:variable name="pos" select="position()" />  
                        <xsl:for-each select="descendant-or-self::value">  
                         <po>$pos:<xsl:value-of select="$pos"/> | pos(): <xsl:value-of select="position()"/> | val:<xsl:value-of select="."/></po>  
                         <xsl:choose>  
                          <xsl:when test="following-sibling::value[position() = 1]">  
                           <fspo>fs val:<xsl:value-of select="following-sibling::value"/></fspo>  
                           <xsl:call-template name="Temp1">  
                            <xsl:with-param name="add" select="$add+$share" />  
                           </xsl:call-template>  
                          </xsl:when>  
                          <xsl:otherwise>  
                           <xsl:if test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">  
                            <otw>start otherwiese</otw>  
                            <xsl:call-template name="Temp1">  
                             <xsl:with-param name="add" select="$add+$share" />  
                            </xsl:call-template>  
                           </xsl:if>  
                          </xsl:otherwise>  
                         </xsl:choose>  
                        </xsl:for-each>  
                       </xsl:template>  
                      
                      

                      Das XSL wird ausgeführt und der Template wird aufgerufen. (Ich dokumentieren hier die Schritte und die Ausgabe dazu):
                      Wir stehen vor dem xsl:choose, die Ausgabe ist:

                      <po>$pos:1 | pos(): 1 | val:100</po>

                      So weit normal, wir sind im:

                      <Intervall name="30.05.2003">  
                         <value>100</value>
                      

                      Weiter geht es in den xsl:when (da es auf der following-sibling-Achse ein 'value' gibt). Wir stehen vor dem xsl:call-template, die Ausgabe ist:

                         <po>$pos:1 | pos(): 1 | val:100</po>  
                         <fspo>fs val:105</fspo>
                      

                      Das ist auch noch korrekt.

                      Jetzt wird das Template rekursiv aufgerufen und wir stehen wieder vor dem xsl:choose und die ausgabe ist:

                        
                         <po>$pos:1 | pos(): 1 | val:100</po>  
                         <fspo>fs val:105</fspo>  
                         <po>$pos:1 | pos(): 1 | val:100</po>  
                      
                      

                      huch!?! Die ersten zwei sind vom ersten Durchgang, aber warum sid alle Werte auch beim zweiten Mal gleich?
                      Weil der Kontextknoten des Templates beim ersten Mal der folgende war:

                      <Intervall name="30.05.2003">  
                         <value>100</value>
                      

                      Und daran hat sich auch nichts geändert! Sprich, der rekursive Aufruf hat hier nicht den Kontextknoten geändert und deshalb beginnt alle immer wieder beim ersten 'Intervall' erster 'value'. Das einzige was brav erhöht wird ist der Wert vom $add.

                      *Zeitraffer eingeschaltet*
                      Der Templateaufruf im xsl:when wurde auskommentiert und die Transformation wieder losgetreten. Beim 4. Durchlauf(*) - wir stehen _jetzt_ vor dem xsl:otherwise - sieht die Ausgabe so aus :

                        
                         <po>$pos:1 | pos(): 1 | val:100</po>  
                         <fspo>fs val:105</fspo>  
                         <po>$pos:2 | pos(): 1 | val:105</po>  
                         <fspo>fs val:110</fspo>  
                         <po>$pos:3 | pos(): 1 | val:110</po>  
                         <fspo>fs val:115</fspo>  
                         <po>$pos:4 | pos(): 1 | val:115</po>  
                      
                      

                      Das ist auch klar, nach <value>115</value> gab es keinen following-sibling::value[position() = 1] mehr, also kommt xsl:otherwise zum Zug.

                      ad *) hier wurde "unsichtbar" rekursiv gearbeitet, denn das Template matcht "value" also wird er rekursiv für alle values im Intervall aufgerufen. Deshalb haben wir bei $pos die Position, die das aktuell bearbeitete "value" hat. Wohingegen pos() bedingt durch das for-each immer 1 ergibt.
                      Das führt wieder zur Feststellung, dass for-each keine Schleife ist.

                      Wir gehen ins xsl:otherwise rein, der Template wird wieder rekursiv aufgerufen und wir stehen wieder vor xsl:choose, die Ausgabe ist:

                        
                         <po>$pos:1 | pos(): 1 | val:100</po>  
                         <fspo>fs val:105</fspo>  
                         <po>$pos:2 | pos(): 1 | val:105</po>  
                         <fspo>fs val:110</fspo>  
                         <po>$pos:3 | pos(): 1 | val:110</po>  
                         <fspo>fs val:115</fspo>  
                         <po>$pos:4 | pos(): 1 | val:115</po>  
                      <-- bis dahin sind wir gekommen und weiter gehts: -->  
                         <otw>start otherwiese</otw>  
                         <po>$pos:1 | pos(): 1 | val:115</po>  
                      
                      

                      Huch!?!
                      Warum ist nach dem Templateaufruf $pos und pos() beide 1?
                      Das ist wie beim letzen Mal, der Kontextknoten ist diesmal zwar

                      <Intervall name="30.05.2003">  
                         <value>115</value>
                      

                      aber weil hier - wie auch obe - das Template _durch_ seinen Namen aufgerufen wurde, hat sich der Kontextknoten nicht geändert und in diesem Kontext ist <value>115</value> der einzige Knoten und somit hat er auch position() = 1.

                      Wenn wir hier weiter die Transformation ausführen bleiben wir in dieser Endlosschleife vom xsl:otherweise, da <value>115</value> keinen following-sibling::value[position() = 1] hat und somit eben xsl:otherweise zum Zug kommt.

                      Das ist also die Geschichte deiner zwei Endlosschleifen. ;-)

                      Eigentlich kannst du auf den rekursiven Templateaufruf verzichten, aber ich sehe dein Problem damit, du willst, dass $add immer erhöht wird.
                      Also ist die alternative, dass du den Kontextknoten wechselst:

                        
                       <xsl:template match="value" name="Temp1">  
                        <xsl:param name="add" select="0"/>  
                        <xsl:param name="knoten" select="." />  
                        <xsl:for-each select="$knoten/descendant-or-self::value">  
                         <xsl:choose>  
                          <xsl:when test="following-sibling::value[position() = 1]">  
                           <g class="Lines1">  
                            <line x1="{$add}%" y1="{.}%" x2="{$add+$add}%" y2="{following-sibling::value[position() = 1]}%"/>  
                           </g>  
                           <xsl:call-template name="Temp1">  
                            <xsl:with-param name="add" select="$add+$share"/>  
                            <xsl:with-param name="knoten" select="following-sibling::value[position() = 1]" />  
                           </xsl:call-template>  
                          </xsl:when>  
                          <xsl:otherwise>  
                           <xsl:if test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">  
                            <g class="Lines1">  
                             <line x1="{$add}%" y1="{.}%" x2="{$add+2}%" y2="{parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]}%"/>  
                            </g>  
                            <xsl:call-template name="Temp1">  
                             <xsl:with-param name="add" select="$add+$share"/>  
                             <xsl:with-param name="knoten" select="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]" />  
                            </xsl:call-template>  
                           </xsl:if>  
                          </xsl:otherwise>  
                         </xsl:choose>  
                        </xsl:for-each>  
                       </xsl:template>  
                      
                      

                      Was du jetzt noch anschauen musst ist, dass durch
                      <xsl:apply-templates select="Intervall"/>
                      natürlich das Ganze so oft ausgeführt wir, wie viele Intervall-Elemente du in deinem XML hast.

                      Grüße
                      Thomas

                      1. Zu aller ersteinmal ein super großes Dankeschön für diese AUsführliche erklärung!
                        Ich werde sie mir in Ruhe angucken und dir dann ein feedback geben ob es geklappt hat.

                        VIELEN DANK
                        Markus

                        1. Hi,
                          ALso Ich hab das alles so eingestelllt wie du gesagt hast funktioniert jetzt eig. super, nur das Problem welches du mir erzählt hat mit den Azahl der Wiederholungen kirege ich nicht hin.

                          Ihc rufe diese template auf und dann kommt das:

                           <xsl:template match="/Intervall/value" name="Temp1">  
                                  <xsl:param name="add">0</xsl:param>  
                                  <xsl:param name="knoten" select="."/>  
                                  <xsl:param name="countInt" select="$CountforInt"></xsl:param>  
                            
                                  <xsl:for-each select="$knoten/descendant-or-self::value">  
                            
                                          <xsl:choose>  
                                              <xsl:when test="following-sibling::value[position() = 1]">  
                                                  <g class="Lines1">  
                                                      <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div ($MaxV - $MinV)))}%" x2="{$add+$share}%"  
                                                          y2="{100-(((following-sibling::value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%"/>  
                                                  </g>  
                                                  <xsl:call-template name="Temp1">  
                                                      <xsl:with-param name="countInt" select="$countInt+$CountforInt"/>  
                                                      <xsl:with-param name="add" select="$add+$share"/>  
                                                      <xsl:with-param name="knoten"  
                                                          select="following-sibling::value[position() = 1]"/>  
                                                  </xsl:call-template>  
                                              </xsl:when>  
                                              <xsl:otherwise>  
                                                  <xsl:if test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">  
                                                      <g class="Lines1">  
                                                          <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div ($MaxV - $MinV)))}%" x2="{$add+$share}%"  
                                                              y2="{100-(((parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%"/>  
                                                      </g>  
                                                  </xsl:if>  
                                                          <xsl:call-template name="Temp1">  
                                                          <xsl:with-param name="countInt" select="$countInt+$CountforInt"/>  
                                                          <xsl:with-param name="add" select="$add+$share"/>  
                                                          <xsl:with-param name="knoten"  
                                                              select="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]"  
                                                          />  
                                                      </xsl:call-template>  
                            
                            
                                              </xsl:otherwise>  
                                          </xsl:choose>  
                            
                                  </xsl:for-each>  
                            
                              </xsl:template>
                          

                          Ich hatte jetzt die Idee countInt so hochzuzählen das er nachdem erstenmal durchgehne aufhört. Das abbrechen funktioniert eig. auch soweit völlig InOrdnung jedoch geht er beim abbrechen nciht aus dem template sonder nur aus der "schleife" und geht zum anfang des templates wo der zähler wieder auf 0 gesetzt wird...
                          Ich habe wirklich keine Idee wie ich dies bewerkstäligen soll.
                          MfG
                          Bahr

                          1. Hallo,

                            ALso Ich hab das alles so eingestelllt wie du gesagt hast funktioniert jetzt eig. super, nur das Problem welches du mir erzählt hat mit den Azahl der Wiederholungen kirege ich nicht hin.

                            Ich hatte jetzt die Idee countInt so hochzuzählen das er nachdem erstenmal durchgehne aufhört. Das abbrechen funktioniert eig. auch soweit völlig InOrdnung jedoch geht er beim abbrechen nciht aus dem template sonder nur aus der "schleife" und geht zum anfang des templates wo der zähler wieder auf 0 gesetzt wird...
                            Ich habe wirklich keine Idee wie ich dies bewerkstäligen soll.

                            Ich sehe keine Abfrage/Verwendung von $countInt im Template, also kann ich dazu nichts sagen.

                            Wenn du nicht willst, dass das Template für alle Intervalle gilt, sage es doch dem Template: entweder durch:
                            <xsl:template match="/Intervall[1]"> oder besser durch:
                            <xsl:apply-templates select="Intervall[1]" />

                            Grüße
                            Thomas

                            1. Ich sehe keine Abfrage/Verwendung von $countInt im Template, also kann ich dazu nichts sagen.

                              Im untern code so geändert wie icc es dachte

                              Wenn du nicht willst, dass das Template für alle Intervalle gilt, sage es doch dem Template: entweder durch: <xsl:template match="/Intervall[1]"> oder besser durch: <xsl:apply-templates select="Intervall[1]" />

                              Also es soll für alle INtervalle gültig sein, heisst: Nachdem er jeden value durchgegangen ist hört auf. Mit deinem Vorschlag, geschieht zwar das es nur einmal alle durchgeht heist: 14 Intervall dann 13 Intervalle dann 12 Intervalle dann 11Intervall

                              Ohne diese [1]  passiert dies

                              44Intervalle 34 Intervalle usw.

                              Ich will jedeoch, dass er einmal alle 4(zurzeit) Intervalle druchgeht.

                              Die derzeitige Ausgabe ist diese hier:

                                 <line x1="5.625%" y1="69.23076923076923%" x2="11.25%" y2="84.61538461538461%"/>
                                 <line x1="11.25%" y1="84.61538461538461%" x2="16.875%" y2="61.53846153846153%"/>
                                 <line x1="16.875%" y1="61.53846153846153%" x2="22.5%" y2="57.69230769230769%"/>
                                 <line x1="22.5%" y1="57.69230769230769%" x2="28.125%" y2="53.84615384615385%"/>
                                 <line x1="28.125%" y1="53.84615384615385%" x2="33.75%" y2="50%"/>
                                 <line x1="33.75%" y1="50%" x2="39.375%" y2="46.15384615384615%"/>
                                 <line x1="39.375%" y1="46.15384615384615%" x2="45%" y2="42.30769230769231%"/>
                                 <line x1="45%" y1="42.30769230769231%" x2="50.625%" y2="38.46153846153846%"/>
                                 <line x1="50.625%" y1="38.46153846153846%" x2="56.25%" y2="30.76923076923076%"/>
                                 <line x1="56.25%" y1="30.76923076923076%" x2="61.875%" y2="30.76923076923076%"/>
                                 <line x1="61.875%" y1="30.76923076923076%" x2="67.5%" y2="26.92307692307692%"/>
                                 <line x1="67.5%" y1="26.92307692307692%" x2="73.125%" y2="23.076923076923066%"/>
                                 <line x1="73.125%" y1="23.076923076923066%" x2="78.75%" y2="19.230769230769226%"/>
                                 <line x1="78.75%" y1="19.230769230769226%" x2="84.375%" y2="15.384615384615387%"/>
                                 <line x1="84.375%" y1="15.384615384615387%" x2="90%" y2="30.76923076923076%"/>
                              
                              
                              <-- Hier soll eig Ende sein -->
                              
                                 <line x1="5.625%" y1="84.61538461538461%" x2="11.25%" y2="61.53846153846153%"/>
                                 <line x1="11.25%" y1="61.53846153846153%" x2="16.875%" y2="57.69230769230769%"/>
                                 <line x1="16.875%" y1="57.69230769230769%" x2="22.5%" y2="53.84615384615385%"/>
                                 <line x1="22.5%" y1="53.84615384615385%" x2="28.125%" y2="50%"/>
                                 <line x1="28.125%" y1="50%" x2="33.75%" y2="46.15384615384615%"/>
                                 <line x1="33.75%" y1="46.15384615384615%" x2="39.375%" y2="42.30769230769231%"/>
                              ...
                              ...
                              ...
                                 
                              

                              Jetzt zum 1ten Punkt: (erst der relevante teil und dann später kommt der ganze code)

                                 <xsl:template match="/data/Intervall/value" name="Temp1">
                                      <xsl:param name="add" select="$add.GRAPH"/>
                                      <xsl:param name="knoten" select="."/>
                                      <xsl:param name="countInt" select="$CountforInt"/>
                                      <xsl:for-each select="$knoten/descendant-or-self::value">
                                          <xsl:choose>
                                              <xsl:when test="following-sibling::value[position() = 1]">
                                                  <g class="Lines1">
                                                      <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div ($MaxV - $MinV)))}%"
                                                          x2="{$add+$add.GRAPH}%"
                                                          y2="{100-(((following-sibling::value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%"
                                                      />
                                                  </g>
                                                 <-- <xsl:if test="$countInt &lt; $Length"> -->
                                                      <xsl:call-template name="Temp1">
                                                          <xsl:with-param name="countInt" select="$countInt+$CountforInt"/>
                                                          <xsl:with-param name="add" select="$add+$add.GRAPH"/>
                                                          <xsl:with-param name="knoten"
                                                              select="following-sibling::value[position() = 1]"/>
                                                     <-- </xsl:call-template> -->
                                                  </xsl:if>
                                              </xsl:when>
                                              <xsl:otherwise>
                                                  <xsl:if
                                                      test="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]">
                                                      <g class="Lines1">
                                                          <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div $Delta))}%"
                                                              x2="{$add+$add.GRAPH}%"
                                                              y2="{100-(((parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%"
                                                          />
                                                      </g>
                                                 </xsl:if>
                                                  <-- <xsl:if test="$countInt &lt; $Length"> -->
                                                      <xsl:call-template name="Temp1">
                                                          <xsl:with-param name="countInt" select="$countInt+$CountforInt"/>
                                                          <xsl:with-param name="add" select="$add+$add.GRAPH"/>
                                                          <xsl:with-param name="knoten"
                                                              select="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]"
                                                          />
                                                      </xsl:call-template>
                                                <--  </xsl:if> -->
                                              </xsl:otherwise>
                                          </xsl:choose>
                                      </xsl:for-each>
                                  </xsl:template>
                              

                              So hatte ich mir das gedacht.

                              eine Lösung die halbwegs funktioniert ist, wenn ihc die position abfrage und wenn er dann bei 1ten duch ist wird ja position 2 und dann hört er auf.

                              also:

                               <xsl:param name="test" select="position()"/>
                                      <xsl:if test="$test &lt; 2">
                                          <xsl:for-each select="$knoten/descendant-or-self::value">
                              

                              und halt am ende

                              </xsl:if>

                              jedoch ist bei der ausgabe in xml dann dies hier:

                              g class="Lines1">
                                    <line x1="84.375%" y1="15.384615384615387%" x2="90%" y2="30.76923076923076%"/>
                                 </g><-- 120125130135140150150155160165170150 Das sol da eig. nicht sein --><g class="Num-left">
                                    <text x="10.625%" y="95%">30.05.2003</text>
                              
                              
                              

                              Xsl

                              <?xml version="1.0" encoding="UTF-8"?>
                              <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                                  xmlns="http://www.w3.org/2000/svg">
                                  <xsl:output method="xml" omit-xml-declaration="no" indent="yes" version="1.0"
                                      doctype-system="-//W3C//DTD SVG 1.1//EN"
                                      doctype-public="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"/>
                                  <xsl:variable name="Length" select="count(/data/Intervall)"> </xsl:variable>
                                  <xsl:variable name="Lenghteach" select="count(/data/Intervall/value)"/>
                                  <xsl:variable name="add.GRAPH" select="(90 div $Length div ($Lenghteach div $Length))"/>
                                  <xsl:variable name="MaxV">
                                      <xsl:for-each select=" descendant-or-self::value">
                                          <xsl:sort data-type="number" order="descending"/>
                                          <xsl:if test="position()=1">
                                              <xsl:value-of select="(.)+20"/>
                                          </xsl:if>
                                      </xsl:for-each>
                                  </xsl:variable>
                                  <xsl:variable name="MinV">
                                      <xsl:for-each select=" descendant-or-self::value">
                                          <xsl:sort data-type="number" order="ascending"/>
                                          <xsl:if test="position()=1">
                                              <xsl:value-of select="(.)-20"/>
                                          </xsl:if>
                                      </xsl:for-each>
                                  </xsl:variable>
                                  <xsl:variable name="Delta" select="$MaxV - $MinV"/>
                                  <xsl:variable name="Linecount">
                                      <xsl:choose>
                                          <xsl:when test="$Delta &lt;= 20">
                                              <xsl:value-of select="5"/>
                                          </xsl:when>
                                          <xsl:otherwise>
                                              <xsl:value-of select="6"/>
                                          </xsl:otherwise>
                                      </xsl:choose>
                                  </xsl:variable>
                                  <xsl:variable name="CountforInt" select="$Length div $Lenghteach"/>
                                  <xsl:variable name="LgthforIntvll" select="(90 div $Length)"/>
                                  <xsl:template match="/data">
                                      <xsl:processing-instruction name="xml-stylesheet">type="text/css"
                                          href="/Users/Azubi/Desktop/Unbenannt1.css"</xsl:processing-instruction>
                                      <svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="50%" height="50%">
                                          <g class="Background-rect">
                                              <rect width="100%" height="100%"/>
                                          </g>
                                          <g class="Num-left">
                                              <g class="Lines3">
                                                  <xsl:call-template name="BuildLines"> </xsl:call-template>
                                              </g>
                                          </g>
                                          <g class="Lines2">
                                              <line x1="5%" y1="90%" x2="95%" y2="90%"/>
                                          </g>
                                          <xsl:apply-templates select="Intervall/value"/>
                                          <xsl:call-template name="Temp2"/>
                                      </svg>
                                  </xsl:template>
                                  <xsl:template name="BuildLines">
                                      <xsl:param name="counter">0</xsl:param>
                                      <text x="3%" y="{100-((x - $MinV)*(100 div ($MaxV - $MinV)))}">
                                          <xsl:value-of select="x"/>
                                      </text>
                                      <line x1="5%" y="{100-((x - $MinV)*(100 div ($MaxV - $MinV)))}" x2="95%"
                                          y2="{100-((x - $MinV)*(100 div ($MaxV - $MinV)))}"/>
                                      <xsl:if test="$counter &lt; $Linecount">
                                          <xsl:call-template name="BuildLines">
                                              <xsl:with-param name="counter" select="$counter+1"/>
                                          </xsl:call-template>
                                      </xsl:if>
                                  </xsl:template>
                              
                              <--Hier der Obere Code rein-->
                              
                                  </xsl:template>
                              </xsl:stylesheet>
                              
                              
                              1. Hallo,

                                Wenn du nicht willst, dass das Template für alle Intervalle gilt, sage es doch dem Template: entweder durch:
                                <xsl:template match="/Intervall[1]"> oder besser durch:
                                <xsl:apply-templates select="Intervall[1]" />

                                Also es soll für alle INtervalle gültig sein, heisst: Nachdem er jeden value durchgegangen ist hört auf. Mit deinem Vorschlag, geschieht zwar das es nur einmal alle durchgeht heist:
                                1*4 Intervall
                                dann
                                1*3 Intervalle
                                dann
                                1*2 Intervalle
                                dann
                                1*1Intervall

                                Ohne diese [1]
                                passiert dies

                                4*4Intervalle
                                3*4 Intervalle
                                usw.

                                Verstehe ich nicht ganz:
                                <xsl:apply-templates select="Intervall"/>

                                dann führe ich das XSLT aus (im R habe ich den Wert vom Value hineingeschreiben um zu sehen/zeigen was gerade abgearbeitet wurde), ausgabe (hier etwas verkürtzt)

                                  
                                <line x1="5.625%" y1="82.6086956521739%" x2="11.25%" y2="78.26086956521739%" R="100"/>  
                                   <line x1="11.25%" y1="78.26086956521739%" x2="16.875%" y2="73.91304347826087%" R="105"/>  
                                   <line x1="16.875%" y1="73.91304347826087%" x2="22.5%" y2="69.56521739130434%" R="110"/>  
                                   <line x1="22.5%" y1="69.56521739130434%" x2="28.125%" y2="65.21739130434783%" R="115"/>  
                                   <line x1="28.125%" y1="65.21739130434783%" x2="33.75%" y2="60.869565217391305%" R="120"/>  
                                   <line x1="33.75%" y1="60.869565217391305%" x2="39.375%" y2="56.52173913043478%" R="125"/>  
                                   <line x1="39.375%" y1="56.52173913043478%" x2="45%" y2="52.173913043478265%" R="130"/>  
                                   <line x1="45%" y1="52.173913043478265%" x2="50.625%" y2="47.82608695652174%" R="135"/>  
                                   <line x1="50.625%" y1="47.82608695652174%" x2="56.25%" y2="43.47826086956522%" R="140"/>  
                                   <line x1="56.25%" y1="43.47826086956522%" x2="61.875%" y2="39.130434782608695%" R="145"/>  
                                   <line x1="61.875%" y1="39.130434782608695%" x2="67.5%" y2="34.78260869565217%" R="150"/>  
                                   <line x1="67.5%" y1="34.78260869565217%" x2="73.125%" y2="30.434782608695656%" R="155"/>  
                                   <line x1="73.125%" y1="30.434782608695656%" x2="78.75%" y2="26.086956521739125%" R="160"/>  
                                   <line x1="78.75%" y1="26.086956521739125%" x2="84.375%" y2="21.73913043478261%" R="165"/>  
                                   <line x1="84.375%" y1="21.73913043478261%" x2="90%" y2="17.391304347826093%" R="170"/>
                                

                                bis dahin ist alles OK.
                                Jetzt sehe ich einen Fehler, als <Intervall name="30.05.2006"><value>175</value> erreicht ist.

                                Das Template wurde aufgerufen, $knoten ist jetzt eben "<value>175</value>". Hier trifft xsl:when nicht, denn es gibt keinen "following-sibling::value", also geht es in xsl:otherwise hinein, die xs:if trifft auch nicht zu, denn es gibt auch keinen "parent::Intervall/following-sibling::Intervall" also es wird hier kein  <line> erzeugt!

                                Das sollten wir also zuerst beheben.

                                <xsl:otherwise>  
                                     <xsl:if test="(parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1])">  
                                      <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div $Delta))}%" x2="{$add+$add.GRAPH}%" y2="{100-(((parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%"/>  
                                     </xsl:if>  
                                     <xsl:if test="not(parent::Intervall/following-sibling::Intervall)">  
                                      <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div $Delta))}%" x2="{$add+$add.GRAPH}%" y2=" HIER FEHLT JETZT DER WERT!"/>  
                                     </xsl:if>
                                

                                Führen wir die Transformation erneut aus, kommt jetzt alles richtig:

                                   <line x1="84.375%" y1="21.73913043478261%" x2="90%" y2="17.391304347826093%" R="170"/>  
                                   <line x1="90%" y1="17.391304347826093%" x2="95.625%" y2="" R="175"/>
                                

                                bis eben auf y2 für das letzte <line>.

                                Wenn ich dich richtig verstehe sollte es hier dann auch Schluß sein mit der Transformation?

                                Dann verschieben wir xsl:call-template:

                                  
                                <xsl:template match="value" name="Temp1">  
                                  <xsl:param name="add" select="$add.GRAPH"/>  
                                  <xsl:param name="knoten" select="."/>  
                                  <xsl:for-each select="$knoten/descendant-or-self::value">  
                                   <xsl:choose>  
                                    <xsl:when test="following-sibling::value[position() = 1]">  
                                     <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div ($MaxV - $MinV)))}%" x2="{$add+$add.GRAPH}%" y2="{100-(((following-sibling::value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%" R="{.}"/>  
                                     <xsl:call-template name="Temp1">  
                                      <xsl:with-param name="add" select="$add+$add.GRAPH"/>  
                                      <xsl:with-param name="knoten" select="following-sibling::value[position() = 1]"/>  
                                     </xsl:call-template>  
                                    </xsl:when>  
                                    <xsl:otherwise>  
                                     <xsl:if test="(parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1])">  
                                      <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div $Delta))}%" x2="{$add+$add.GRAPH}%" y2="{100-(((parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%" R="{.}"/>  
                                      <xsl:call-template name="Temp1">  
                                       <xsl:with-param name="add" select="$add+$add.GRAPH"/>  
                                       <xsl:with-param name="knoten" select="parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]"/>  
                                      </xsl:call-template>  
                                     </xsl:if>  
                                     <xsl:if test="not(parent::Intervall/following-sibling::Intervall)">  
                                      <line x1="{$add}%" y1="{100-(((.) - $MinV)*(100 div $Delta))}%" x2="{$add+$add.GRAPH}%" y2="{100-(((parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]) - $MinV)*(100 div ($MaxV - $MinV)))}%" R="{.}"/>  
                                     </xsl:if>  
                                    </xsl:otherwise>  
                                   </xsl:choose>  
                                  </xsl:for-each>  
                                 </xsl:template>  
                                
                                

                                Und auch das xsl:apply-templates müssen wir ändern:

                                <xsl:apply-templates select="Intervall[1]/value[1]"/>

                                Da im Template immer wieder auf Folgeknoten von value zugegriffen wird, und diese dann auch ins Template geholt werden, brauchen wir nur Intervall[1]/value[1] um die gewünschte ausgabe zu erzeugen.
                                Auf $countInt" kann man komplett verzichten.

                                Ich hoffe das Hilft!

                                Grüße
                                Thomas

                                1. Verstehe ich nicht ganz:

                                  »» <xsl:apply-templates select="Intervall"/>  
                                  956521739125%" x2="84.375%" y2="21.73913043478261%" R="165"/>  
                                  
                                  >    <line x1="84.375%" y1="21.73913043478261%" x2="90%" y2="17.391304347826093%" R="170"/>
                                  
                                  

                                  Ja, der wird zwar benutz aber der nächste value davon auch!
                                  Deswegen ist dies hier falsch und funktioniert nicht.

                                  Jetzt sehe ich einen Fehler, als <Intervall name="30.05.2006"><value>175</value> erreicht ist.

                                  Das Template wurde aufgerufen, $knoten ist jetzt eben "<value>175</value>". Hier trifft xsl:when nicht, denn es gibt keinen "following-sibling::value", also geht es in xsl:otherwise hinein, die xs:if trifft auch nicht zu, denn es gibt auch keinen "parent::Intervall/following-sibling::Intervall" also es wird hier kein  <line> erzeugt!

                                  Wenn ich dich richtig verstehe sollte es hier dann auch Schluß sein mit der Transformation?

                                  Und auch das xsl:apply-templates müssen wir ändern:

                                  <xsl:apply-templates select="Intervall[1]/value[1]"/>

                                  Hat hiermit super funktioniert vielen Dank nochmal!

                                  Ps: Super Forum!