首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT:如何调用以字符串形式给出的用户定义函数

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

Stack Overflow用户
提问于 2020-11-18 03:59:12
回答 1查看 45关注 0票数 0

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

如何在XSLT`中使用call(func-string)

代码语言:javascript
复制
<?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>
代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 07:21:11

使用xsltproc (xsltproc是针对libxml 20910、libxslt 10134和libexslt820编译的),我可以使用EXSLT dyn:evaluate函数动态调用XPath 1.0函数和func:function定义的函数:

代码语言:javascript
复制
<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>

运行时(为了示例的简单性,我使用了没有命名空间的元素)

代码语言:javascript
复制
<html  xmlns:jr="http://openrosa.org/javarosa">
    <label ref="jr:itext('calculate_test_output')"/>
    <label ref="concat('test', ' 1')"/>
</html>

输出

代码语言:javascript
复制
<label>itext calculate_test_output</label>
<label>test 1</label>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64882470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档