我有一个XSLT脚本,我想在每次调用模板时按顺序编号.所以它的缩写版本看起来有点像:
<xsl:call-template name="insertHeader" />
<xsl:for-each ...>
<xsl:call-template name="insertHeader" />
...
</xsl:for-each>
<xsl:call-template name="insertHeader" />
<xsl:template name="insertHeader>
This is item number <xsl:value-of select="$numberOfInvocations />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
很明显$ numberOfInvocations的东西不起作用,而且在XSLT中你不能增加一个全局计数器变量,这似乎是一种过程语言中的明显方法.我想在第一次调用模板时打印出1,第二次打印出来,等等.我应该怎样做呢?这在XSLT中是否可以远程实现?
谢谢 :)
编辑:所以有一些评论说明这个问题没有明确定义.我想要做的是在(HTML)输出中标记一系列表.我看到这样做最明显的方法是调用一个函数(你可能会告诉我这里不是一个XSLT向导),每次都会自动增加数字.我认为这看起来很难的原因是因为XSLT本身定义了这些表的出现而不是输入.
这个额外的信息可能没那么多用,因为Dimitre的答案让它听起来更像是永远不会起作用.不管怎么说,还是要谢谢你 :)
在作为XSLT的函数语言中,没有定义"计算顺序".
因此,试图通过"及时"排序对"计算"进行编号是没有意义的,如果尝试通常会产生令人惊讶的结果.
例如,没有任何限制<xsl:apply-templates>以与所选节点列表中的节点的文档顺序相同的顺序应用模板.这些可以并行完成,意味着以任何顺序.
许多XSLT处理器执行 lazy evaluation意味着只有在真正需要时才会评估某个XSLT指令,而不是根据XSLT样式表中的文本顺序进行评估.通常一些指令根本不执行.
有时优化器会执行 两次给定的XSLT指令,因为它决定丢弃第一个结果以优化空间利用率.
可以使用递归(通常)和继续传递样式 CPS或Monads(更具体地)来产生所请求的编号.
FXSL库(版本1 - 用于XSLT 1.0和版本2 - 用于XSLT 2.0)包含可用于组织此类编号的模板:foldl,foldr,iter,iterUntil,scanl,scanr,...等.
无论何时精确定义问题(这不是当前情况),都可以产生这样的编号,但是要警告结果.