我有一个递归模板,以便我可以更新计数。在模板中,我希望能够使用当前计数来访问索引为当前计数的节点。
<!-- 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时这很有效。
有人能指出我正在制造的明显错误吗?...
非常感谢
答案 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