在xlst、.net中传递应用模板选择的参数

在xlst、.net中传递应用模板选择的参数,.net,xslt,xpath,.net,Xslt,Xpath,我的xslt文件中包含以下内容: <xsl:param name="predicate" select="//Event" /> <xsl:apply-templates select="$predicate" /> 但无论我为谓词传递什么,我都会得到错误“表达式必须计算到节点集。” 是否有方法将xpath选择器传递到转换中?最终,$predicate以下是字符串“//事件[@valid]”-您基本上完成了以下操作: <xsl:apply-templates se

我的xslt文件中包含以下内容:

<xsl:param name="predicate" select="//Event" />
<xsl:apply-templates select="$predicate" />
但无论我为谓词传递什么,我都会得到错误“表达式必须计算到节点集。”


是否有方法将xpath选择器传递到转换中?

最终,
$predicate
以下是字符串
“//事件[@valid]”
-您基本上完成了以下操作:

<xsl:apply-templates select="'//Event[@valid]'"/>

当然,由于xslt是xml,另一种方法是将xslt加载到DOM中,并在执行之前替换xpath表达式。

最终,
$predicate
以下是字符串
“//Event[@valid]”
-您基本上完成了:

<xsl:apply-templates select="'//Event[@valid]'"/>
当然,由于xslt是xml,另一种方法是将xslt加载到DOM中,并在执行之前替换xpath表达式

您只是将一个字符串传递给样式表,但是样式表使用
谓词
参数作为节点集——它对其执行

解决方案

计算现在作为字符串传递的XPath表达式。例如,使用方法。然后将结果作为参数传递给转换

您只是将一个字符串传递给样式表,但是样式表使用
谓词
参数作为节点集——它对其执行

解决方案


计算现在作为字符串传递的XPath表达式。例如,使用方法。然后将生成的

好问题+1作为参数传递给转换。请参阅我的答案以了解解释和完整的解决方案。:)请注意,参数声明必须是顶级声明,以便在调用时将其值传递给XSLT处理器。请参阅我的答案以了解解释和完整的解决方案。:)请注意,参数声明必须是顶级声明,以便在调用时将其值传递给XSLT处理器。您可以传递XSLT/XPath数据允许的任何数据类型Model@Dimitre:很接近,我有一个XPathNavigator,我用select()得到了一个XPathNodeIterator。但是你所说的“作为参数传递给转换”是什么意思呢?我不知道如何让迭代器选择的节点通过xslt进行转换。谢谢你的帮助@Wavel:您已经有了相同的代码:相同的
args.AddParam()
,但是第三个参数使用的是XPathNodeIterator。@Dimitre:非常接近,但到目前为止:)我想我应该使用AddParam()传入XPathNodeIterator,但是在xslt中如何处理它呢?你能给我举几个xsl的例子吗?@Wavel:你有:
,或者你可以通过:
+1个好答案来验证它。您可以传递XSLT/XPath数据允许的任何数据类型Model@Dimitre:很接近,我有一个XPathNavigator,我用select()得到了一个XPathNodeIterator。但是你所说的“作为参数传递给转换”是什么意思呢?我不知道如何让迭代器选择的节点通过xslt进行转换。谢谢你的帮助@Wavel:您已经有了相同的代码:相同的
args.AddParam()
,但是第三个参数使用的是XPathNodeIterator。@Dimitre:非常接近,但到目前为止:)我想我应该使用AddParam()传入XPathNodeIterator,但是在xslt中如何处理它呢?你能给我举几个xsl的例子吗?@Wavel:你有:
或者你可以通过:
<xsl:param name="valid" select="" />
<xsl:apply-templates select="//Event[@valid=$valid]" />
args.AddParam("predicate", "", "//Event[@valid]");