2016-06-22 22 views
0

は、この機能はほとんど差と同様の作用を行う名前でXSLTユーザー定義関数を呼び出す方法はありますか?

<xsl:function name="f:functionA" as="xs:string"> 
     <xsl:param name="object"/> 
     <xsl:value-of select="'a'"/> 
    </xsl:function> 

    <xsl:function name="f:functionB" as="xs:string"> 
     <xsl:param name="object"/> 
     <xsl:value-of select="'b'"/> 
    </xsl:function> 

私はいくつかのユーザー定義関数があるとします。質問は:私はこの関数を名前で呼び出すことができますか?たとえば、変数に格納されていますか?

<xsl:var name="handlerName" select="f:getHandler($element)"/> 
<xsl:value-of select="invoke-by-name($handlerName, $param1, $param2, 'param3')"/> 

答えて

1

これは、XSLT/XPath 3.0で、 function-lookup(xs:QName('f:functionA'), 1)('foo')であり、これはという名前のファンクションがアライティ1(すなわち1つのパラメータを持つ)であり、それを文字列fooを引数として呼び出します。

XSLT/XPath/XQuery 3.0のfunction-lookupの定義については、https://www.w3.org/TR/xpath-functions-30/#func-function-lookupを参照してください。

二つの機能を使用して、完全な例は

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    xmlns:f="http://example.com/f" 
    exclude-result-prefixes="xs math f" 
    version="3.0"> 

    <xsl:function name="f:functionA" as="xs:string"> 
     <xsl:param name="object"/> 
     <xsl:sequence select="'A: ' || $object"/> 
    </xsl:function> 

    <xsl:function name="f:functionB" as="xs:string"> 
     <xsl:param name="object"/> 
     <xsl:sequence select="'B: ' || $object"/> 
    </xsl:function> 

    <xsl:template name="main"> 
     <xsl:value-of select="function-lookup(xs:QName('f:functionA'), 1)('foo'), function-lookup(xs:QName('f:functionB'), 1)('bar')"></xsl:value-of> 
    </xsl:template> 

</xsl:stylesheet> 

出力A: foo B: barあります。

XSLT 2.0では、Dimitre Novatchevが記述した手法をhttp://edu.cs.uni-magdeburg.de/EC/lehre/sommersemester-2011/funktionale-programmierung/folien-und-materialien/Higher-Order%20Functional%20Programming%20with%20XSLT%202.0%20and%20FXSL.pdfで実行する必要があります。これは、XSLT 2.0で高次関数を記述する方法を示しています。

+0

実際に変数に関数の名前を格納するのではなく、関数自体を変数に格納する方が良いでしょう: ' ' –

+0

@MichaelKay、私は同意だが、' f:getHandler($ element) 'いくつかの入力要素から名前を選択するように見えたので、 'function-lookup'を使うことが必要かもしれないと思いました。 –

関連する問題