Markus B.: Problem beim auswählen der Werte aus der XML

Der Code erklärt alles.

Bei der AUsgabe steht der Fehler

Bitte nur die AUsgabewerte beachten, ich weiss dass dies so bisher noch falsch ist.

XML

<data>
    <Intervall name="30.05.2003">
        <value>100</value>
        <value>124</value>
        <value>87</value>
    </Intervall>
    <Intervall name="30.09.2004">
        <value>94</value>
        <value>151</value>
        <value>143</value>
    </Intervall>
    <Intervall name="30.01.2005">
        <value>168</value>
        <value>170</value>
        <value>203</value>
    </Intervall>
</data>

XSL

<xsl:template match="Intervall" name="Temp1">
        <xsl:call-template name="Temp2">
            <xsl:with-param name="counter">1</xsl:with-param>
        </xsl:call-template>
    </xsl:template>

<xsl:template name="Temp2">
      <xsl:param name="counter"></xsl:param>
        <xsl:param name="y1">
            <xsl:for-each select="value">
            <xsl:if test="position()=$counter">
                <xsl:value-of select="."/></xsl:if>
            </xsl:for-each>
        </xsl:param>
            <xsl:param name="y2">
                <xsl:for-each select="value">
                    <xsl:if test="position()=$counter+1">
                        <xsl:value-of select="."/></xsl:if>
                </xsl:for-each>
       </xsl:param>
            <text  x1="{$y1}" x2="{$y2}"/>

<xsl:if test="$counter &lt;3">

<xsl:call-template name="Temp2">
                <xsl:with-param name="counter" select="$counter+1"></xsl:with-param>
            </xsl:call-template>
            </xsl:if>

</xsl:template>

AUSGABE

<text x1="100" x2="124"/>
   <text x1="124" x2="87"/>
   <text x1="87" x2=""/> <<<<<<<<<<<< Hier soll eig. 94 stehen
   <text x1="94" x2="151"/>
   <text x1="151" x2="143"/>
   <text x1="143" x2=""/><<<<<<<<<<<<< Hier soll eig. 168 stehen
   <text x1="168" x2="170"/>
   <text x1="170" x2="203"/>
   <text x1="203" x2=""/><<<<<<<<<<<<< Das könnt ihr vernachlässigen, weil .                                      hier ja ende ist.

  1. Also ich würde es nicht so kompliziert machen und einen rekursiven template Mechanismus wählen. Eine einfach Lösung wäre doch:

      
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
        <xsl:output method="xml" indent="yes"/>  
        <xsl:template match="/" name="Temp1">  
            <xsl:for-each select="descendant-or-self::value">  
                <xsl:choose>  
                    <!-- teste auf vorhandene folgewert in gleichen knoten -->  
                    <xsl:when test="following-sibling::value[position() = 1]">  
                        <text x1="{.}" x2="{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 x1="{.}" x2="{parent::Intervall/following-sibling::Intervall[position() = 1]/value[position() = 1]}"/>  
                        </xsl:if>  
                    </xsl:otherwise>  
                </xsl:choose>  
            </xsl:for-each>  
        </xsl:template>  
    </xsl:stylesheet>  
    
    

    Gruß, Holge r

    1. WOW,
      super vielen Dank, die Antowrt hat mir sehr geholfen

      Mfg
      Markus

      1. Jetzt hab ihc noch ein Problem bekommen

        <text xmlns="http://www.w3.org/2000/svg" x1="100" x2="124"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="124" x2="87"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="87" x2="94"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="94" x2="151"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="151" x2="143"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="143" x2="168"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="168" x2="170"/>
        <text xmlns="http://www.w3.org/2000/svg" x1="170" x2="203"/>

        warum kommt jetzt diese xmlns da rein?

        1. ok geht wieder

  2. Hi,

    <xsl:template match="Intervall" name="Temp1">
            <xsl:call-template name="Temp2">
                <xsl:with-param name="counter">1</xsl:with-param>
            </xsl:call-template>
        </xsl:template>

    Du rufst Temp2 also mit einem Parameter auf.

    <xsl:template name="Temp2">
          <xsl:param name="counter"></xsl:param>
            <xsl:param name="y1">

    Temp2 hat aber mehrere Parameter.
    Oder hätte das eigentlich xsl:variable sein sollen?

    <xsl:for-each select="value">
                <xsl:if test="position()=$counter">
                    <xsl:value-of select="."/></xsl:if>
                </xsl:for-each>

    <xsl:value-of select="value[position()=$counter]/>

    sollte dasselbe bewirken wie Deine Schleife.

    </xsl:param>
                <xsl:param name="y2">
                    <xsl:for-each select="value">
                        <xsl:if test="position()=$counter+1">
                            <xsl:value-of select="."/></xsl:if>
                    </xsl:for-each>
           </xsl:param>

    <text  x1="{$y1}" x2="{$y2}"/>

    sollte sich sogar auf
    <text x1="{value[position()=$counter]}" x2="{value[position()=$counter+1]}"/>
    reduzieren lassen.

    <xsl:if test="$counter &lt;3">
                <xsl:call-template name="Temp2">
                    <xsl:with-param name="counter" select="$counter+1"></xsl:with-param>
                </xsl:call-template>
                </xsl:if>

    Daß hier beim 3. Aufruf jeweils "" für x2 rauskommt, liegt daran, daß auf ein value[position()=4] zugegriffen werden soll - in jedem Intervall gibt es aber nur 3 value-Elemente.

    Du solltest das nicht in jedem Intervall für alle Kinder namens value machen, sondern in data eine Schleife über alle Nachfahren namens value machen.

    <text x1="203" x2=""/><<<<<<<<<<<<< Das könnt ihr vernachlässigen, weil .                                      hier ja ende ist.

    Das könnte man noch mit position() != last() abfangen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.