我的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选择器传递给转换?
答案 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 。