如何计算XSLT中模板的调用?

Pet*_*ter 5 xslt

我有一个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的答案让它听起来更像是永远不会起作用.不管怎么说,还是要谢谢你 :)

Dim*_*hev 6

在作为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,...等.

无论何时精确定义问题(这不是当前情况),都可以产生这样的编号,但是要警告结果.

  • @Peter:首先,一切都是从输入源确定的,如果你将种子带入帐户,它是否只有一个,多个,内联到样式表,或伪随机性(我必须考虑两次关于monoids).你是不情愿的只是因为**你不能**.最后,无论是在XSLT 1.0中使用扩展功能还是在XSLT 2.0中使用扩展功能,两步转换都是一种非常普遍的模式,可以提高某些算法的性能,这一点你绝对想要进入你的包...... (2认同)