假设我有几个用户定义的函数
<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')"/>
答案 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中编写更高阶的函数。