2009-07-07 5 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となります。

$Queryをハードコードされた式(パラメータ値として渡しているのと同じ値)に置き換えると、正常に機能するため、selectから来ていることが分かります。

アイデア?これも可能ですか?

フランク

答えて

2

XSLTがコンパイルされ、実行時にXPathの再評価をサポート(標準に従って)しない - だけで、コンパイル時に。

Saxonなどのプロセッサによっては、いくつかの制限がありますが、これを許可する拡張機能があります。 .Net version of the Saxon XSLT processor.Net API page)をチェックしてください。 Saxonには、saxon:evaluateという拡張機能があり、実行時にXPathの構築と評価を行うことができます。

組み込みのMicrosoft XSLTエンジンは、計算済みのselect XPath式をサポートしていません。

回避策の1つは、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()"> 

エラー「式はノード集合に評価されなければならない」とは、式が返すノードでselectが動作できるように、適切なxml形式であることを意味する。

関連する問題