有没有办法按名称调用XSLT用户定义的函数?

时间:2016-06-22 11:37:01

标签: 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 个答案:

答案 0 :(得分:1)

您可以在XSLT / XPath 3.0中使用例如function-lookup(xs:QName('f:functionA'), 1)('foo')将找到名为f:functionA且具有arity 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中编写更高阶的函数。