我正在寻找一个关于如何在for-each循环中添加变量的想法。
<group>
<spare bitCnt="5"/>
<integer name="A" bitCnt="11"/>
<spare bitCnt="15"/>
<integer name="B" bitCnt="1"/>
</group>
预期的头文件输出:
UINT16 A: 11;
UINT16 spare: 5;
UINT16 B: 1;
UINT16 spare 15;
我需要继续在&#39;组中添加变量的bitCnt。如果变量落在2个字节的字边界上,我需要交换元素的顺序。
我的问题是&#34;当我在for-each循环中运行元素时,如何跟踪bitCnt?&#34; 我想在xslt和for-each循环中使用totalBitCnt,继续添加totalBitCnt以确定是否&#34; totalBitCnt mod 16&#34;是零。 因此,当它运行循环时,它会像5,18(5 + 13),23(15 + 18),24(23 + 1)那样增加。 任何一般方法都受到高度赞赏。
谢谢,
答案 0 :(得分:0)
我不确定我是否理解了你的具体情况,所以我会一般性地回答。
在for循环中累积是一种迭代方法,而XSLT(我猜你使用的是1.0)在这方面是非常有限的。我认为你最好的办法是设置一些递归的东西。
可以定义和调用命名模板,而不是for-each循环。您可以使用以下参数定义它:要处理的元素列表和累加器。
<xsl:template name="accumulator-template">
<xsl:param name="elements"/>
<xsl:param name="accumulator"/>
<!-- do stuff to the first element -->
<xsl:variable name="elements-left" select="$elements[???]"/> <!-- Exclude element that was processed -->
<xsl:choose>
<xsl:when test="$elements-left">
<!-- LOOPING -->
<xsl:call-template name="accumulator-template">
<xsl:with-param name="elements" select="$elements-left"/>
<xsl:with-param name="accumulator" select="$accumulator + number(@stuff)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- END OF LOOP -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
然后你调用它而不是为每个循环编写内联:
<xsl:call-template name="accumulator-template">
<xsl:with-param name="elements" select="group"/>
<xsl:with-param name="elements" select="0"/> <!-- or any other starting value -->
</xsl:call-template>