在xslt,.net中传递应用模板选择的参数

时间:2011-02-17 21:27:23

标签: .net xslt xpath

我的xslt文件中有以下内容:

<xsl:param name="predicate" select="//Event" />
<xsl:apply-templates select="$predicate" />

这样可以正常工作,但现在我想从我的.net代码中更改参数。

var args = new XsltArgumentList();
args.AddParam("predicate", "", "//Event[@valid]");
xmlviewer.TransformArgumentList = args;

但无论我为谓词传递什么,我都会收到错误“表达式必须评估为节点集。”

有没有办法将xpath选择器传递给转换?

2 个答案:

答案 0 :(得分:0)

最终,$predicate这里是字符串 "//Event[@valid]" - 您基本上已经完成了:

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

即。试图评估字符串上的模板。那不行。但可以测试@valid,例如

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

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

答案 1 :(得分:0)

args.AddParam("predicate", "", "//Event[@valid]");

您只是将一个字符串传递给样式表,但样式表使用predicate参数作为节点集 - 它在其上执行<xsl:apply-templates>

解决方案

评估您现在作为字符串传递的XPath表达式。例如,使用 Select() XPathNavigator 方法。然后将结果作为参数传递给转换结果 XPathNodeIterator