如何在XSLT中使用参数作为索引

时间:2010-09-15 14:39:54

标签: xml xslt

我有一个递归模板,以便我可以更新计数。在模板中,我希望能够使用当前计数来访问索引为当前计数的节点。

<!-- in the template -->

<xsl:param name="i"/>
<xsl:param name="count"/>      

<NewNode>
    <xsl:value-of select="//ACommonElementInTheDocument[$i]/MyElement"/> : <xsl:value-of select="$i"/>
</NewNode>

我正如预期的那样正确地打印出$ i,但是我无法引用该元素,尽管当我使用XMLSpy测试XPath时这很有效。

有人能指出我正在制造的明显错误吗?...

非常感谢

2 个答案:

答案 0 :(得分:4)

在XSLT 1.0 / XPath 1.0中,变量/参数未明确键入

因此,在XSLT 1.0中,解决方案是使用:

someExpression[position() = $i]

someExpression[number($i)]

在XSLT 2.0 中,最好将参数定义为xs:integer

<xsl:param name="i" as="xs:integer"/>

然后使用

someExpression[$i]

产生想要的结果。

请注意,但是,表达式如下:

//ACommonElementInTheDocument[1]

不会选择文档中名为ACommonElementInTheDocument的第一个元素。

此表达式选择作为其父级的第一个ACommonElementInTheDocument子元素的每个 ACommonElementInTheDocument元素 - 因此上面的表达式通常可能返回许多元素,并且可能没有它们将是文档中的第一个ACommonElementInTheDocument

这就是为什么@ Per-T的解决方案很可能是错误的 - 无论是在XSLT 1.0还是在XSLT 2.0中

而不是

//ACommonElementInTheDocument[number($i)]/MyElement 

使用

(//ACommonElementInTheDocument)[number($i)]/MyElement 

记住[]运算符绑定比//缩写更强(优先级更高)。

答案 1 :(得分:1)

我不确定您是如何声明参数的。但我的猜测是这是一个类型转换问题。如果你尝试会发生什么:

//ACommonElementInTheDocument[number($i)]/MyElement

或者在XSLT 2.0中,您也可以使用XML Schema类型之一:

//ACommonElementInTheDocument[xs:integer($i)]/MyElement