我有一个简单的测试:
<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"
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.StringBuffer
或java.lang.StringBuilder
。