Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在XSLT中使用参数作为索引_Xml_Xslt - Fatal编程技术网

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)。请参阅我的答案,以了解目前唯一正确的解决方案。