我将参数从C#传递给<xsl: for each>
中的xsl,但我没有得到输出。
这是我的代码,直到现在
<xsl:param name="xpath" select="sessions/session"/>
<xsl:template match="/">
<xsl:value-of select="$xpath"/>
<xsl:for-each select="exsl:node-set($xpath)">
转变为whith
XslCompiledTransform xslt = new XslCompiledTransform();
XsltArgumentList xsArgs = new XsltArgumentList();
xslt.Load(strXstFile);
//creating xpath through some logic , it is working fine
xsArgs.AddParam("xpath", "", xpath);
MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, Encoding.ASCII);
StreamReader rd = new StreamReader(ms);
xslt.Transform(doc, xsArgs, writer);
我正在检查值,并且值正在按照我的要求完美传递但是当我在xsl中使用t hem时:foreach它没有显示我期望的结果。早些时候我没有使用exsl:node-set它是抛出错误,所以我使用它,但我想这是让我的字符串别的。
知道如何解决这个问题吗?
答案 0 :(得分:3)
我怀疑您是否误解了可以将参数或变量设置为字符串然后将该字符串用作XPath查询。你不能。
此:
<xsl:param name="xpath" select="sessions/session"/>
创建一个名为xpath
的参数,默认情况下将其设置为节点集。由于上下文节点是根节点,因此如果输入文档的顶级元素名为sessions
并且它至少有一个session
子元素,则节点集将只包含任何内容。
以下是$xpath
不包含的内容:XPath表达式。
如果在C#代码中将参数设置为包含XPath表达式的字符串,那么它将包含一个字符串,而不是包含节点集。这样:
<xsl:value-of select='$xpath'/>
将发出该字符串,并且:
<xsl:for-each select='exsl:node-set($xpath)'>
将不执行任何操作,因为node-set
函数期望其参数为结果树片段,$xpath
包含字符串。
我敢打赌,你真正想做的事情更像是这样:将参数名称从xpath
更改为误导性较小的内容,例如nodeset
,并创建节点集在你的C#代码中:
xsArgs.AddParam("nodeset", "", doc.SelectNodes(xpath));