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>
我必须在下面的 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>