从某些位置循环使用 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
因为不需要
这是我的 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
因为不需要