Xml 如何在XSLT中使用参数作为索引
我有一个递归模板,以便更新计数。在模板中,我希望能够使用当前计数来访问索引为当前计数的节点Xml 如何在XSLT中使用参数作为索引,xml,xslt,Xml,Xslt,我有一个递归模板,以便更新计数。在模板中,我希望能够使用当前计数来访问索引为当前计数的节点 <!-- in the template --> <xsl:param name="i"/> <xsl:param name="count"/> <NewNode> <xsl:value-of select="//ACommonElementInTheDocument[$i]/MyElement"/> : <xsl:
<!-- 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时,这非常有效
有谁能指出我犯的明显错误吗
非常感谢我不确定您是如何声明参数的。但我猜这是一个类型转换问题。如果您尝试以下操作,会发生什么情况:
//ACommonElementInTheDocument[number($i)]/MyElement
或者在XSLT 2.0中,也可以使用以下XML模式类型之一:
//ACommonElementInTheDocument[xs:integer($i)]/MyElement
我不确定您是如何声明参数的。但我猜这是一个类型转换问题。如果您尝试以下操作,会发生什么情况:
//ACommonElementInTheDocument[number($i)]/MyElement
或者在XSLT 2.0中,也可以使用以下XML模式类型之一:
//ACommonElementInTheDocument[xs:integer($i)]/MyElement
XSLT 1.0/XPath 1.0中的变量/参数未显式键入 因此,在XSLT 1.0中,解决方案是使用:
someExpression[position() = $i]
或
在XSLT2.0中,最好将参数定义为xs:integer
:
<xsl:param name="i" as="xs:integer"/>
产生想要的结果
但是,请注意如下表达式:
//ACommonElementInTheDocument[1]
不选择文档中名为ACommonElementInTheDocument
的第一个元素
此表达式选择文档中的每个accommonElementintheDocument
元素,该元素是其父元素的第一个accommonElementintheDocument
子元素——因此,上述表达式通常可能返回许多元素,并且可能没有一个元素是文档中的第一个accommonElementintheDocument
这就是为什么@Per-T的解决方案很可能是不正确的——在XSLT1.0和XSLT2.0中都是如此
而不是:
//ACommonElementInTheDocument[number($i)]/MyElement
使用
(//ACommonElementInTheDocument)[number($i)]/MyElement
请记住:
[]
运算符绑定的强度(优先级)高于/
缩写。在XSLT 1.0/XPath 1.0中,变量/参数没有显式键入
因此,在XSLT 1.0中,解决方案是使用:
someExpression[position() = $i]
或
在XSLT2.0中,最好将参数定义为xs:integer
:
<xsl:param name="i" as="xs:integer"/>
产生想要的结果
但是,请注意如下表达式:
//ACommonElementInTheDocument[1]
不选择文档中名为ACommonElementInTheDocument
的第一个元素
此表达式选择文档中的每个accommonElementintheDocument
元素,该元素是其父元素的第一个accommonElementintheDocument
子元素——因此,上述表达式通常可能返回许多元素,并且可能没有一个元素是文档中的第一个accommonElementintheDocument
这就是为什么@Per-T的解决方案很可能是不正确的——在XSLT1.0和XSLT2.0中都是如此
而不是:
//ACommonElementInTheDocument[number($i)]/MyElement
使用
(//ACommonElementInTheDocument)[number($i)]/MyElement
请记住:
[]
运算符绑定的强度(优先级)高于/
缩写。对于您关于强制转换的问题,简单的答案是,它有效。这不是已经是一个数字了吗?非常感谢您令人难以置信的快速回答:)正如我所说的,这取决于您如何声明参数或首先将参数发送到模板。如果您用更多的代码提出一个新问题,我们可能会更好地为您解释。很高兴它成功了!:)关于索引类型匹配,您是对的。但是,我认为你需要谈谈/
运算符和谓词之间的优先级…@Alejandro:你当然是对的。然而,我并没有认真思考这个问题,因为它不是原始问题的一部分。对于你关于演员的问题,简单的答案是,它是有效的。这不是已经是一个数字了吗?非常感谢您令人难以置信的快速回答:)正如我所说的,这取决于您如何声明参数或首先将参数发送到模板。如果您用更多的代码提出一个新问题,我们可能会更好地为您解释。很高兴它成功了!:)关于索引类型匹配,您是对的。但是,我认为你需要谈谈/
运算符和谓词之间的优先级…@Alejandro:你当然是对的。然而,我并没有认真思考这个问题,因为它不是原始问题的一部分。好问题(+1)。请参阅我的答案,了解目前唯一正确的解决方案。好问题(+1)。请参阅我的答案,以了解目前唯一正确的解决方案。