在XSLT中设置标志以检测第一次循环

时间:2012-11-20 02:46:03

标签: variables xslt foreach umbraco

xslt新手。在umbraco中使用它,因此它的版本为1.0。

尝试在内联页脚列表中的链接之间插入分隔符,因此将它们放在除第一个链接之外的每个链接之前。这是一个简单的编程问题,你在循环外设置一个标志为0,然后一旦进入,你测试标志是否为1,如果不是,你跳过在链接之前添加一个分隔符。作为第一次通过循环的最后一位,将标志设置为1.

如何在xslt中完成此操作?我对语法和阅读感到有些不安,一旦设置了变量值,你就无法改变它。任何人都有一个简单的例子吗?

2 个答案:

答案 0 :(得分:3)

以下是一个简单示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pBase" select="'http://myBase.com/'"/>

 <xsl:template match="num">
  <xsl:if test="position() > 1">, </xsl:if>
  <a href="{$pBase}{.}"><xsl:value-of select="."/></a>
 </xsl:template>
</xsl:stylesheet>

对以下XML文档应用此转换时:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

产生了想要的正确结果:

<a href="http://myBase.com/01">01</a>, <a href="http://myBase.com/02">02</a>, <a href="http://myBase.com/03">03</a>, <a href="http://myBase.com/04">04</a>, <a href="http://myBase.com/05">05</a>, <a href="http://myBase.com/06">06</a>, <a href="http://myBase.com/07">07</a>, <a href="http://myBase.com/08">08</a>, <a href="http://myBase.com/09">09</a>, <a href="http://myBase.com/10">10</a>

,并在浏览器中显示为

01020304050607080910

<强>解释

  1. XSLT是一种函数式语言 - 除此之外,这意味着变量一旦定义就无法更改。

  2. 标准XPath position() 功能可用于检查当前节点的位置是否具有特定值。

  3. 使用 builtin XSLT templates ,与元素匹配的元素具有此正文:<xsl:apply-templates/>。这是:<xsl:apply-templates select="child::node()"/>的缩写,并将模板应用于当前节点的所有节点子节点 - 按文档顺序。

  4. 因为我们已经指定了<xsl:strip-space elements="*"/>,所以在解析XML文档期间,任何元素的空白子元素都被剥离了。这只留下顶部元素nums的非空白子节点,它们都是num个元素。

  5. 模板内position()函数的值是执行<xsl:apply-templates>指令时形成的节点列表中当前节点的位置。这意味着在处理第一个position()元素时,匹配num的模板中num函数的值为1,处理第二个num元素时为2。 ..,10处理第10个num元素时。

  6. num的值大于1的所有position()元素的生成输出以字符串“,”开头 - 完全按照此问题的要求。对于第一个num元素,不会生成字符串“,”,因为在这种情况下position()的值为1.

答案 1 :(得分:2)

在XSLT中没有时间这样的东西。你无法检测到“第一次循环”,因为没有时间概念,因此没有第一次,事实上,它根本不是传统编程意义上的循环。输入列表中的所有项目在概念上并行处理。这就是为什么你不能设置变量以便在以后的迭代中使用 - 没有“后来的迭代”这样的东西。

您可以做的是检测您正在处理输入序列中的第一项(或排序后输入序列中的第一项,如果您使用xsl:sort)。您可以使用测试position() = 1执行此操作。