2009-07-07 55 views
0

我有以下...使用參數作爲選擇的xsl:對,每個

<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參數的值是for-eachselect

當我在C#中執行這個轉變我得到... Expression must evaluate to a node-set

我知道它來自select,因爲如果我用硬編碼表達式(與傳遞的參數值相同的值)替換$Query,它可以正常工作。

任何想法?這甚至有可能嗎?

弗蘭克

回答

2

XSLT是編譯,並沒有(按標準),在運行時支持的XPath重新評估 - 僅在編譯時。

有些處理器,如撒克遜人,確實有擴展,允許這一點,雖然他們有一些限制運行。您可能要檢查出.Net version of the Saxon XSLT processor.Net API page)。撒克遜人有一個名爲saxon:evaluate的擴展功能,它可以讓你運行XPath的建設和評估。

內置的微軟XSLT引擎不支持計算select XPath表達式。

解決方法之一是將XSLT構建爲字符串,替換爲您的路徑,然後以此方式運行。

0

這是可能的,只有你的查詢是XML格式。對於例如(在如下面從輸入格式拍攝REQD通過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可以在表達式返回的節點上工作。

相關問題