使用XSLT 1.0转换文档遇外部函数调用禁用错误求助
XSLT 1.0 扩展函数调用报错问题解决
问题描述
使用XSLT 1.0转换文档时出现报错:
Cannot find a 1-argument function named Q{http://exslt.org/math}max().
External function calls have been disabled.
样式表头部代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" xmlns:xalan="http://xml.apache.org/xalan" extension-element-prefixes="exsl">
尝试修改命名空间后(错误格式),仍收到报错:
External function calls have been disabled.
询问该问题是否与权限或配置文件有关。
问题分析与解决
这个问题核心是转换引擎的配置限制,和权限关联不大,具体说明如下:
原因
XSLT 1.0本身没有内置max()函数,你使用的math:max()属于EXSLT扩展函数,而你的转换环境(比如Xalan)已经被配置为禁用外部扩展函数调用,因此无论使用哪个命名空间的扩展函数都会触发报错。
解决办法
开启扩展函数支持
如果使用Xalan作为转换引擎,需要在配置中启用外部函数:- 若通过Java代码调用,需设置属性
http://xml.apache.org/xalan/features/allow-external-functions为true; - 若使用命令行工具,查找对应开启扩展函数的参数(比如部分工具支持
-E或类似参数)。
- 若通过Java代码调用,需设置属性
纯XSLT 1.0实现最大值逻辑
不需要依赖扩展函数,自己编写模板实现取最大值:<xsl:template name="get-max"> <xsl:param name="nodes"/> <xsl:param name="current-max" select="$nodes[1]"/> <xsl:choose> <xsl:when test="$nodes"> <xsl:variable name="next-node" select="$nodes[1]"/> <xsl:call-template name="get-max"> <xsl:with-param name="nodes" select="$nodes[position() > 1]"/> <xsl:with-param name="current-max" select="$next-node[$next-node > $current-max] | $current-max[$next-node <= $current-max]"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$current-max"/> </xsl:otherwise> </xsl:choose> </xsl:template>调用示例:
<xsl:call-template name="get-max"> <xsl:with-param name="nodes" select="your-node-set"/> </xsl:call-template>修正命名空间声明
你之前修改命名空间的方式错误,xalan math不是合法的声明格式。如果要使用Xalan自带的数学函数,正确的命名空间是xmlns:math="http://xml.apache.org/xalan/java/java.lang.Math",但前提是已经开启扩展函数支持,否则仍会报错。
内容的提问来源于stack exchange,提问作者Phillip
相关产品推荐
相关产品推荐

