我有一个XML文件,其中描述了具有属性值的元素,这些属性值描述了完全限定的Java类名。我正在尝试编写一个XSLT转换来修改在该文件中描述的类名,例如,com.example.MyClass
的出现将变为 com.example.MockMyClass
。
以下是原始文件片段中的示例:
<event type="node-enter">
<action name="MyActionName" class="com.example.MyClass">
<bodyTemplate>
templates/MyTemplate.vm
</bodyTemplate>
</action>
</event>
I want the result to be:
<event type="node-enter">
<action name="MyActionName" class="com.example.MockMyClass">
<bodyTemplate>
templates/MyTemplate.vm
</bodyTemplate>
</action>
</event>
我正在使用Java JAXP API进行此转换,并编写了一个可爱的XSLT 2.0兼容的正则表达式例程来获取我想要的结果,但是发现Java 5不支持XSLT 2.0,这是需要正则表达式支持的。
所以我的问题是,使用陈旧的JAXP XSLT 1.0 API,最佳方法是什么?也就是说,不使用正则表达式。我寻找类似的问题,但是对于反向引用正则表达式组的要求似乎使得这个问题棘手起来。这个问题是一个开始,但是我需要在匹配字符串中插入文本,而不仅仅是替换。
供参考,这是我的正则表达式(XSLT 2.0)尝试:
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<xsl:analyze-string select='action/@class' regex='([A-Za-z0-9]+[$\.])+([A-Za-z0-9]+)'>
<xsl:matching-substring>
<xsl:value-of select='regex-group(1)'/>
<xsl:text>Mock</xsl:text>
<xsl:value-of select='regex-group(2)'/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select='.'/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
$
是什么意思?如果它应该匹配行尾或字符串结尾,那么它不是必须跟随一个字母数字吗?如果是这样,它似乎是多余的。但也许我误解了它。 - LarsH$
符号的作用是为了匹配内部类,例如com.example.MyClass$Inner
。但我现在发现这个正则表达式也会匹配像com$example.MyClass
这样的字符串,所以如果我要继续使用正则表达式解决方案,我需要修复这个错误。 - Ryan Bennetts