【问题标题】:Regex in XSLT 1.0 using java使用 java 的 XSLT 1.0 中的正则表达式
【发布时间】:2017-09-07 06:18:13
【问题描述】:

我有一个简单的测试:

<xsl:if test="boolean(java:java.util.regex.Pattern.matches('a', 'a'))">
        <xsl:message terminate="no">success</xsl:message>
</xsl:if>

虽然它抛出了这个错误:

ERROR:  'Cannot convert argument/return type in call to method 'java.util.regex.Pattern.matches(string, string)''
FATAL ERROR:  'Cannot convert argument/return type in call to method 'java.util.regex.Pattern.matches(string, string)''

我知道 java 实用程序可以工作,因为下面的代码编译得很好:

<xsl:value-of select="java:format(java:java.text.SimpleDateFormat.new('dd/MM/yyyy, hh:mm a'), java:java.util.Date.new())"/>

我是否错误地使用了Pattern.matches(),或者我缺少什么技巧? 我似乎在 xslt 中找不到任何关于 java 的可靠文档。

我已在文档顶部声明了 java 命名空间:

xmlns:java="http://xml.apache.org/xslt/java"

【问题讨论】:

    标签: java regex xml xslt xslt-1.0


    【解决方案1】:

    Pattern.matches的签名是

    static boolean matches(String regex, CharSequence input)
    

    请注意,第二个参数不是String,而是CharSequence,并且String(XSLT) 和CharSequence (Java) 之间没有定义映射。因此,您必须通过创建实现所需接口CharSequence(例如java.lang.String)的类的对象来手动进行转换。

    如果您将 XSLT 测试表达式更改为

    java:java.util.regex.Pattern.matches('a', java:java.lang.String.new('a'))
    

    它有效。

    这在 Xalan-Java 的文档中有所描述,有关更多详细信息,请参阅 https://xml.apache.org/xalan-j/extensions.html#ext-functions

    尽管如此,我发现它似乎并不总是像记录的那样工作;手动创建java.lang.String 类型的对象有时不起作用。然后您必须尝试使用​​其他实现所需接口的类,在这种情况下,任何采用 Java 字符串并提供所需 Java 字符序列接口的类,例如java.lang.StringBufferjava.lang.StringBuilder

    【讨论】:

    • 感谢您的解释,马库斯。我很欣赏这不仅仅是“这是一个可行的解决方案”。这清除了我在 xslt 中使用 java 时遇到的一些障碍。
    • @XavierDass 谢谢。我刚刚意识到我忘记添加您还要求的文档链接。有关更多信息,请参阅更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2015-12-29
    • 2018-10-25
    • 2015-09-18
    • 2016-07-18
    相关资源
    最近更新 更多