使用参数作为xsl:for-each的选择

时间:2009-07-07 01:08:46

标签: xslt

我有以下内容......

<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(与我作为参数值传递的值相同),它可以正常工作。

有什么想法吗?这甚至可能吗?

2 个答案:

答案 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可以在表达式返回的节点上工作。