Problem beim auswählen der Werte aus der XML
Markus B.
- xsl
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 <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.
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
WOW,
super vielen Dank, die Antowrt hat mir sehr geholfen
Mfg
Markus
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?
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 <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