gpt4 book ai didi

function - Xalan 2.7 中缺少字符串函数,使用 java.lang.String 代替?

转载 作者:行者123 更新时间:2023-12-02 10:53:07 25 4
gpt4 key购买 nike

我使用的是 Xalan 2.7.0(与 Apache FOP 1.0 捆绑在一起),并且在使用字符串函数时遇到问题。

线路<xsl:value-of select="fn:replace('test', 't', '*')"/>导致此异常:

javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)

<xsl:value-of select="fn:string-length('foobar')"/>结果:

javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.stringLength([ExpressionContext,] ).
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)

现在这很奇怪!为什么 Xalan 寻找 stringLength功能于 java.lang.String ?我测试过<xsl:value-of select="fn:substring('foobar', 2, 3)"/> ,事实上:结果是 o ,因此参数被用作 startIndex, endIndex (如 java.lang.String.substring() )而不是 XPath 的 fn:substring(string, start, length)函数。

所以我认为 Xalan 在某种程度上缺少它的 XPath 函数库并使用常规的 String 类。我通过调用不存在的函数 fn:index-of('foobar', 'bar') 确认了这一点工作正常并映射到 java.lang.String.indexOf(str) .

Xalan 为何这么做?我该如何解决它?

系统信息:Xalan 使用标准 Mac OS X 10.6.4 Java 版本 1.6.0_20。

更新

好吧,先把replace()放在一边功能一会儿。作为 XSLT 1.0 处理器,Xalan 不应该实现 XPath 1.0 function substring (string, startIndex, length)而不是 (string, startIndex, endIndex)我在过期时看到的功能?难道巧合的是,这个startIndex、endIndex函数看起来像java.lang.String的substring方法吗? ?

为什么当我使用 fn:string-length 时会收到 NoSuchMethodError 错误功能?

这里出了点问题,而且显然与 XPath 1.0 与 2.0 无关......

最佳答案

replace() 是一个 XSLT 2.0 函数。 Xalan 是一个 XSLT 1.0 处理器。

您可以使用template like this from @Ektron Doug D来模拟replace()函数。 :

<xsl:template name="replace-substring">
<xsl:param name="original"/>
<xsl:param name="substring"/>
<xsl:param name="replacement" select="''"/>
<xsl:choose>
<xsl:when test="contains($original, $substring)">
<xsl:value-of select="substring-before($original, $substring)"/>
<xsl:copy-of select="$replacement"/>
<xsl:call-template name="replace-substring">
<xsl:with-param name="original" select="substring-after($original, $substring)"/>
<xsl:with-param name="substring" select="$substring"/>
<xsl:with-param name="replacement" select="$replacement"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$original"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

请记住,这个 XSLT 1.0 解决方案是一个非常简单的查找/替换。 XSLT 2.0 函数replace() 可以使用REGEX 模式作为“查找”表达式。

关于function - Xalan 2.7 中缺少字符串函数,使用 java.lang.String 代替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3645507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com