2017-09-07 68 views
1

我有这个简单的测试:正则表达式中的XSLT 1.0使用Java

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

回答

2

Pattern.matches签名是

static boolean matches(String regex, CharSequence input) 

注意,第二个参数不是StringCharSequence,并且有没有在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

+0

感谢您的解释,马库斯。我明白,这不仅仅是“这是一个有效的解决方案”。这已经清除了我在xslt中使用java时遇到的一些拦截器。 –

+1

@XavierDass谢谢。我只是意识到我忘了添加你也要求的文档链接。查看更新的答案以获取更多信 – Markus