2009-07-07 4 views
0

ich folgendes ...einen Parameter, der als Auswahl eines xsl: for-each

<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> 

haben möchte ich den Wert des Query Parameter der select des for-each sein.

Wenn ich diese Umwandlung in C# ausführen, bekomme ich ... Expression must evaluate to a node-set.

Ich weiß, dass es von der select kommt, denn wenn ich $Query durch einen hartcodierten Ausdruck (der gleiche Wert, den ich als Parameterwert übergebe) ersetzen, funktioniert es gut.

Irgendwelche Ideen? Ist das überhaupt möglich?

Frank

Antwort

2

XSLT kompiliert wird, und nicht (nach der Norm) Unterstützung XPath Neubewertung zur Laufzeit - nur zur Compile-Zeit.

Einige Prozessoren, wie Saxon, haben Erweiterungen, um dies zu ermöglichen, obwohl sie mit einigen Einschränkungen ausgeführt werden. Vielleicht möchten Sie die .Net version of the Saxon XSLT processor (.Net API page) überprüfen. Saxon hat eine Erweiterungsfunktion namens saxon:evaluate, mit der Sie XPath-Konstruktion und -Auswertung ausführen können.

Die integrierte Microsoft XSLT-Engine unterstützt keine berechneten XPath-Ausdrücke select.

Eine Problemumgehung besteht darin, das XSLT als eine Zeichenfolge zu erstellen, in Ihrem Pfad zu ersetzen und es dann auf diese Weise auszuführen.

0

Es ist nur möglich, wenn Ihre Abfrage in einem XML-Format vorliegt. Für z.B. (Die unten zB aus dem Eingabeformat genommen reqd von 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> 

Hier in Ihrem Xslt können Sie schreiben:

<xsl:for-each select="$Query/OrderBy"> 

oder

<xsl:for-each select="$Query/descendant-or-self::node()"> 

oder

<xsl:for-each select="$Query/child::node()"> 

Der Fehler "Ausdruck muss zu einem Knotensatz ausgewertet werden" bedeutet, dass er in einem geeigneten XML-Format vorliegen muss, damit SELECT an den vom Ausdruck zurückgegebenen Knoten arbeiten kann.

Verwandte Themen