XSLT继续在循环中添加变量

时间:2016-01-25 18:17:19

标签: xslt

我正在寻找一个关于如何在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)那样增加。 任何一般方法都受到高度赞赏。

谢谢,

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>