我有以下内容......
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
(etc.) >
<xsl:param name="Query"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<r:results>
<xsl:for-each select="$Query">
(etc.)
</xsl:for-each>
</r:results>
</xsl:template>
</xsl:stylesheet>
我希望Query
参数的值为select
的{{1}}。
当我在C#中执行此转换时,我得到...... for-each
。
我知道它来自Expression must evaluate to a node-set
,因为如果我用一个硬编码表达式替换select
(与我作为参数值传递的值相同),它可以正常工作。
有什么想法吗?这甚至可能吗?
谢
答案 0 :(得分:2)
XSLT已编译,并且(根据标准)不支持在运行时重新评估XPath - 仅在编译时。
某些处理器(例如Saxon)确实有扩展功能允许这样做,尽管它们有一些限制。您可能需要查看.Net version of the Saxon XSLT processor(.Net API page)。 Saxon有一个名为saxon:evaluate的扩展函数,它允许你进行运行时XPath构建和评估。
内置的Microsoft XSLT引擎不支持计算的select
XPath表达式。
一种解决方法是将XSLT构建为字符串,替换路径,然后以这种方式运行。
答案 1 :(得分:0)
仅当您的查询采用xml格式时才可能。对于例如(例如,以下是取自SharePoint APIs所需的输入格式)
<Query>
<OrderBy>
<FieldRef Name="Modified" Ascending="FALSE"></FieldRef>
</OrderBy>
<Where>
<Or>
<Neq>
<FieldRef Name="Status"></FieldRef>
<Value Type="Text">Completed</Value>
</Neq>
<IsNull>
<FieldRef Name="Status"></FieldRef>
</IsNull>
</Or>
</Where>
</Query>
在你的xslt中你可以写:
<xsl:for-each select="$Query/OrderBy">
或
<xsl:for-each select="$Query/descendant-or-self::node()">
或
<xsl:for-each select="$Query/child::node()">
错误“表达式必须计算到节点集”意味着它应该是正确的xml格式,以便select可以在表达式返回的节点上工作。