代码之家  ›  专栏  ›  技术社区  ›  Jens Bannmann skiwi

Xalan 2.7中缺少字符串函数,java.lang.String文件用什么代替?

  •  4
  • Jens Bannmann skiwi  · 技术社区  · 14 年前

    我使用的是xalan2.7.0(与apachefop1.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使用标准的MacOSX10.6.4Java版本1.6.0\u20。

    更新

    好吧,别管这个了 replace() 暂时停止工作。作为XSLT1.0处理器的Xalan不应该实现 XPath 1.0 function substring (string, startIndex, length) (string, startIndex, endIndex) ?

    为什么我在使用 fn:string-length

    这里出了点问题,显然不是关于XPath1.0和2.0。。。

    4 回复  |  直到 14 年前
        1
  •  3
  •   user357812 user357812    14 年前

    结果来自 substring('foobar', 2, 3) ( )应该是 oob .

    在XSLT1.0中,任何带有前缀的函数调用都将被解释为扩展调用。从 http://www.w3.org/TR/xslt#section-Extension-Functions

    如果FunctionCall中的FunctionName 它包含一个冒号),那么它就是 视为对分机的呼叫 使用命名空间创建名称 评估的声明 上下文。

        2
  •  8
  •   Community Mr_and_Mrs_D    7 年前

    replace() XSLT 2.0版 功能。 沙兰 是一个 XSLT 1.0版

    template like this from @Ektron Doug D :

    <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>
    

    请记住,这个XSLT1.0解决方案是一个非常简单的查找/替换。XSLT2.0函数replace()可以将REGEX模式用于“find”表达式。

        3
  •  4
  •   Vladimir Dyuzhev    12 年前

    当旧的Xalan是唯一的选择时,这个对我来说很有用:

    <xsl:value-of 
       select="java:replaceAll(java:java.lang.String.new(ContactInfo/telephone/text()),'[^0-9]','')"/>
    
        4
  •  1
  •   Dimitre Novatchev    14 年前

    这太奇怪了!为什么Xalan看起来 对于上的stringLength函数 ,事实上:结果是o,所以 结束索引(如 java.lang.String文件.substring()) XPath的fn:substring(string,start, 长度)函数。

    所以我认为Xalan在某种程度上 使用常规字符串类 相反。我打电话确认了这一点 不存在的函数 fn('foobar','bar')的索引 java.lang.String文件.索引(str)。

    修好它?

    1. ? 因为Xalan是XSLT1.0处理器,任何兼容的XSLT1.0处理器都只支持XPath1.0。 replace() 是XPath2.0的标准函数,必须在任何兼容的XSLT2.0处理器中实现。

    2. 我该怎么修 撒克逊9.x 阿尔托瓦2010 . 或者写一个命名的,递归的 <xsl:template> 在XSLT1.0中进行简单的替换。