我必须将XSLT 1.0与下面的XML一起使用。它有一个我用exslt用户定义的函数替代的jr:itext函数。我可以剥离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>发布于 2020-11-18 07:21:11
使用xsltproc (xsltproc是针对libxml 20910、libxslt 10134和libexslt820编译的),我可以使用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>https://stackoverflow.com/questions/64882470
复制相似问题