xml - XSLT:如何调用以字符串形式给出的用户定义函数
问题描述
我必须将 XSLT 1.0 与下面的 XML 一起使用。它有一个功能jr:itext
,我已经用exslt
. jr:itext()
如示例所示,我可以显式剥离并调用该函数,但它看起来很难看,而且我在完整版中有其他函数。
我如何call(func-string)
在 XSLT 中?
<?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 编译的)我可以使用 EXSLTdyn: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>
推荐阅读
- c# - Unity 错误 [错误 CS0120:非静态字段、方法或属性“Zoney.setMonney(int)”需要对象引用]
- deep-learning - YOLOv4 在 Colab Pro 上报告了 30 小时的训练时间,只有 340 张训练图像
- python - AREPL 和控制台显示不同的工作目录(Visual Studio Code 用户) - 为什么?
- amazon-web-services - AWS API Gateway 没有从 OpenAPI/Swagger 获取路径和查询参数验证?
- php - Stripe Checkout 订阅模式不返回 PaymentIntent
- python - matplotlib 绘图函数忽略一行
- javascript - 在 JavaScript 中删除行时行号不更新
- python - 为没有熊猫的 CSV 文件中的表设置索引 col
- c# - 电子邮件在测试用例中工作,但不在 IIS(localdev 或服务器)中
- javascript - 如何在 JavaScript 中读取带有空格的 JSON 响应数据