从某些位置循环使用 fop 通过 xsl 获取 xml 值

Get xml values with xsl using fop from certain positions looping

这是我的 xsl(部分):

<xsl:template name="while">
    <xsl:variable name="VALUE">
        <xsl:value-of select="instData" />
    </xsl:variable>

    <xsl:if test="VALUE=''">
        <xsl:variable name="next_year" select="next_year+1" />
        <xsl:call-template name="while"/>
    </xsl:if>
</xsl:template>

<xsl:template match="/elements">

<xsl:for-each select="values">

<xsl:choose>
    <xsl:when test="(instData != '')">

    <circle cx="{x_coord}" cy="{instData}" r="5" stroke="black" stroke-width="0" fill="{$var_color_instDataCircle}" />

    <xsl:variable name="act_year" select="position()" />
    <xsl:variable name="next_year" select="position()+1" />
    <xsl:variable name="act_x" select="x_coord" />
    <xsl:variable name="act_y" select="instData" />



    <xsl:choose>
        <xsl:when test="next_year/instData = ''">
            <xsl:call-template name="while"/>
        </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="next_x" select="next_year/x_coord" />
        <xsl:variable name="next_y" select="next_year/instData" />
        <line x1="{$act_x}" y1="{$act_y}" x2="{$next_x}" y2="{$next_y}" style="stroke:black;stroke-width:5;" /> 
    </xsl:otherwise>
    </xsl:choose>

    </xsl:when>
    <xsl:otherwise>

    </xsl:otherwise>
</xsl:choose>

</for:each>


</xsl:template>

这是一个xml例子

<elements> 
   <values>
    <year>2015</year>
    <x_coord>88</x_coord>
    <instData></instData>
   </values>
   <values>
    <year>2016</year>
    <x_coord>188</x_coord>
    <instData></instData>
   </values>
   <values>
    <year>2017</year>
    <x_coord>288</x_coord>
    <instData>50</instData>
   </values>
    <values>
    <year>2018</year>
    <x_coord>388</x_coord>
    <instData></instData>
   </values>
   <values>
    <year>2019</year>
    <x_coord>488</x_coord>
    <instData></instData>
   </values>
   <values>
    <year>2020</year>
    <x_coord>588</x_coord>
    <instData>100</instData>
   </values>
   <values>
    <year>2021</year>
    <x_coord>688</x_coord>
    <instData>40</instData>
   </values>
   <values>
    <year>2022</year>
    <x_coord>788</x_coord>
    <instData></instData>
   </values>
 </elements>

我试图达到的目的是绘制一条 instData 值线。 我通过使用 for-each 循环得到第一点,然后我有 xsl:choose 来搜索下一个值(如果有)。获取那些 x_coord 和 instData 值作为该行的第二部分(x_coord 代表 x2,instData 代表 y2)。如果只有 1 个 instData 而不是我只画一个点(那部分有效,因为我事先在 for-each 中画了所有点)。 我无法获得 next_x 和 next_y 的 x2 部分的值。 知道如何让它发挥作用吗?

感谢您的帮助。

如果我理解正确,你可以简单地做:

<xsl:template match="elements">
    <root>
        <xsl:for-each select="values[string(instData)]">
            <xsl:variable name="next" select="following-sibling::values[string(instData)][1]" />
            <xsl:if test="$next">
                <line x1="{x_coord}" y1="{instData}" x2="{$next/x_coord}" y2="{$next/instData}" /> 
            </xsl:if>
        </xsl:for-each>
    </root>
</xsl:template>

得到:

<root>
  <line x1="288" y1="50" x2="588" y2="100"/>
  <line x1="588" y1="100" x2="688" y2="40"/>
</root>

P.S。 XSLT是一种声明式语言:xsl:for-each不是循环,没有while因为不需要