在xslt中添加一个或递增变量

时间:2013-05-30 14:25:58

标签: xslt xslt-1.0

我想根据条件使Counter值递增。但我无法增加值或将1添加到全局变量。我使用以下代码

<xsl:variable name="count">0</xsl:variable>
<xsl:variable name="incre">1</xsl:variable>    

<xsl:template match="/">
  <xsl:if test="$video1 != ''">
    <xsl:variable name="count" select="number($count)+number($incrementor)"/>
    <!-- display video1 -->
  </xsl:if>
  <xsl:if test="$video2 != ''">
    <xsl:variable name="count" select="number($count)+number($incrementor)"/>
    <!-- display video2 -->
  </xsl:if>
  <xsl:if test="$video3 != ''">
    <xsl:if test="$count<2">
      <xsl:variable name="count" select="number($count)+number($incrementor)"/>
      <!-- display video3 -->
    </xs:if>
  </xsl:if>
  <xsl:if test="$video4 != ''">
    <xsl:if test="$count<2">
      <xsl:variable name="count" select="number($count)+number($incrementor)"/>
      <!-- display video4 -->
    </xs:if>
  </xsl:if>
</template>

如何递增count的值或向其添加1。提前谢谢。

1 个答案:

答案 0 :(得分:2)

你的问题来自于在尝试使用函数式语言时像程序员一样思考。这是一个糟糕的组合;当你使用它们而不是反对它们时,工具可以更好地工作。

不要试图遍历文档并增加变量以保持事物的数量。用声明性术语描述你想要的东西。

在这里,您希望显示文档中的前两个非空<video>元素,并且您希望其他元素(所有空<video>元素和第三个以及后来的非空{{1}元素1}}元素)在沉默中传递。 (当然,我正在解决这个问题:既然你没有展示你的XML,我实际上并不知道你真正想要的是什么,用XML术语。)

所以你想要一个模板来抑制空的<video>元素:

<video>

并且您希望模板通过两个或多个非空<xsl:template match="video[not(node())]"/> 元素来压缩文档中前面的任何<video>元素:

<video>

并且您希望模板显示前两个非空<xsl:template match="video[count(preceding::video [* or normalized-space(.)] ) > 1]"/> 元素:

<video>