XSLT:如何调用以字符串形式给出的用户定义函数

XSLT: How to call user-defined function given as string

我必须在下面的 XML 中使用 XSLT 1.0。它有一个函数 jr:itext,我已经用 exslt 的用户定义函数代替了它。我可以剥离 jr:itext() 并显式调用函数,如示例所示,但它看起来很丑,而且我在完整版本中还有其他函数。

如何在 XSLT 中 call(func-string)

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/2002/xforms" xmlns:jr="http://openrosa.org/javarosa">
  <label ref="jr:itext('calculate_test_output')"/>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:jr="http://openrosa.org/javarosa" 
   xmlns:func="http://exslt.org/functions"
     extension-element-prefixes="func" >

    <func:function name="jr:itext">
      <xsl:param name="ref" />
        <func:result select="concat('itext ', $ref)"/>
    </func:function>


    <xsl:template match="/">
       Requested output
      <xsl:value-of select="jr:itext('calculate_test_output')" />,

    Using "call function from string?"
        <xsl:variable name="ref" select="html/label/@ref"/>
        <xsl:value-of select="$ref"/>
<!--      <xsl:execute-this-function select="$ref" />,-->
   
    </xsl:template>

</xsl:stylesheet>

使用 xsltproc(xsltproc 是针对 libxml 20910、libxslt 10134 和 libexslt 820 编译的)它适用于我使用 EXSLT dyn:evaluate 函数调用 XPath 1.0 函数以及 func:function 定义动态运行:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:jr="http://openrosa.org/javarosa" xmlns:func="http://exslt.org/functions"
    extension-element-prefixes="func">

    <func:function name="jr:itext">
        <xsl:param name="ref"/>
        <func:result select="concat('itext ', $ref)"/>
    </func:function>

    <xsl:template match="label">
        <xsl:copy>
            <xsl:value-of select="dyn:evaluate(@ref)" xmlns:dyn="http://exslt.org/dynamic"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

当 运行 反对时(为简单起见,我使用了没有名称空间的元素)

<html  xmlns:jr="http://openrosa.org/javarosa">
    <label ref="jr:itext('calculate_test_output')"/>
    <label ref="concat('test', ' 1')"/>
</html>

产出

<label>itext calculate_test_output</label>
<label>test 1</label>