2

我想让 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。提前致谢。

4

1 回答 1

2

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

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

在这里,您希望显示文档中的前两个非空<video>元素,并且希望其他(所有空<video>元素和第三个及以后的非空<video>元素)以静默方式传递。(当然,这是我编造的:因为你没有显示你的 XML,所以我实际上不知道你真正想要什么,用 XML 术语。)

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

<xsl:template match="video[not(node())]"/>

并且您希望模板抑制<video>文档中前面有两个或多个非空元素的任何<video>元素:

<xsl:template 
  match="video[count(preceding::video
                     [* or normalized-space(.)]
                    ) 
               > 1]"/>

并且您希望模板显示前两个非空<video>元素:

<xsl:template 
  match="video[* or normalized-space(.)]
              [count(preceding::video
                     [* or normalized-space(.)]
                    ) 
               &lt; 2]">

  <xsl:message>Displaying video ... </xsl:message>
  <!--* ... whatever else is needed to display the video ... *-->

<xsl:template>
于 2013-05-30T17:08:13.013 回答