如何使用XSLT v1.0插入文本而不是使用XSLT v2.0正则表达式?
我有一个xml文件,它描述(除其他外)具有描述完全限定的java类名的属性值的元素。 我正在尝试编写一个XSLT转换来修改此文件中描述的类名,这样(例如) com.example.MyClass
ocurrances将变为com.example.MockMyClass
。
以下是原始文件片段上下文中的示例:
templates/MyTemplate.vm
我希望结果如下:
templates/MyTemplate.vm
我正在使用Java JAXP API进行这种转换,并编写了一个可爱的符合XSLT 2.0的regex例程来获得我想要的结果,但却发现Java 5不支持正则表达式支持所需的XSLT 2.0。
所以我的问题是,使用古老的JAXP XSLT 1.0 API实现这一目标的最佳方法是什么? 也就是说,不使用正则表达式。 我寻找类似的问题,但反向引用正则表达式组的要求似乎使这个问题变得棘手。 这个问题是一个开始,但我需要在匹配的字符串中插入文本,而不是仅仅替换 。
作为参考,这是我的正则表达式(XSLT 2.0)尝试:
Mock
以下怎么样?
这将类名作为输入参数,并在最后的“。”之后添加“Mock”。 你可以用它来调用它,例如
(我刚刚在Firefox中试了一下,你可能会发现需要整理一些空白区域。)
以下似乎很长,但它使用现成部分( strRev
模板由FXSL提供,无需重写)。 此外,近一半的代码是身份模板,并将params传递给
。 这在XSLT 2.0中大大缩短。
当我们准备好较小的部件/函数(如strRev
template / reverse()
函数)时,此解决方案不需要编写冗长且容易出错的自制递归代码。
基本的想法是最后的'.'
字符串中的字符是第一个'.'
反转字符串中的字符 。
当此转换应用于提供的XML文档时 :
templates/MyTemplate.vm
产生了想要的正确结果 :
templates/MyTemplate.vm
II。 XSLT 2.0解决方案 :
完全相同的算法,但在XSLT 2.0中真的很短 :