【问题标题】:How to increment a variable inside an XSLT template?如何在 XSLT 模板中增加变量?
【发布时间】:2011-11-05 03:10:01
【问题描述】:

这是我面临的简单问题:

我已经构建了一个自定义内容查询 web 部件,我用列表中的项目填充了这个 CQWP。我想做的是每 3 个项目有一个特殊的分隔符。

如何告诉 XSLT 当前项目是第 3、6 或第 9 个,因此必须放置分隔符?

我想到的是在 itemstyle.xsl 中做类似的事情:

<xsl:variable name="increment" select="0"/>
<xsl:template>
<xsl:with-variable name="increment" select="$increment+1"/>
<xsl:if increment = multiple de 3>
-put a separator-
</xsl:if>
</xsl:template>

但似乎不能以这种方式使用全局变量。因此,我的第二个想法是获取相应项目的“行号”以获取相同的信息。

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 提供样本输入和所需的输出。
  • 问题(除了在任何函数式语言中变量都不能递增的事实之外)是您没有显示源 XML 文档,也没有显示想要的结果。在这种情况下,任何 XML 文档都不会产生任何结果。

标签: xslt


【解决方案1】:

XSLT 不进行破坏性更新。因此,您不能为变量赋值,然后再用新值覆盖该变量。

在您的情况下,您可以将 position() 函数与模运算一起使用:

<xsl:for-each select="*">
  <!-- normal processing here -->
  <xsl:if test="position() mod 3 = 0">
    <!-- separator here -->
  </xsl:if>
</xsl:for-each>

【讨论】:

  • 我已经尝试过了,但没有成功:无论哪个项目当前在循环中,position() 始终设置为 1
  • 如果您向我们展示了您的代码,那么我们可以告诉您哪里出了问题。不要害怕或羞愧!对你的工作提出批评并从中学习是优秀程序员的专业纪律的一部分。只有这样你才能提高。
  • @Holden:请注意,我使用&lt;xsl:foreach&gt; 元素来迭代节点集。 (注意,您也可以在模板的 match 属性中使用谓词表达式。)但关键在于 position() 取决于 current 元素在 current 中的位置selected 节点集——在我的示例中是所有子元素。因此,如果您有一个控制流,其中您的节点集最终只有一个元素,则该元素在该节点集中的位置将始终为 1。
  • 谢谢,我部分解决了我的问题。事实上,我是在操作 itemstyle.xsl 而不是 contentquerymain.xsl。
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2019-08-07
  • 2011-01-31
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多