我有一个xml文件,它描述(除其他外)具有描述完全限定的java类名的属性值的元素.我正在尝试编写一个XSLT转换来修改此文件中描述的类名,这样(例如)com.example.MyClass的ocurrances将变为com.example.MockMyClass.
以下是原始文件片段上下文中的示例:
<event type="node-enter">
<action name="MyActionName" class="com.example.MyClass">
<bodyTemplate>
templates/MyTemplate.vm
</bodyTemplate>
</action>
</event>
我希望结果如下:
<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实现这一目标的最佳方法是什么?也就是说,不使用正则表达式.我寻找类似的问题,但反向引用正则表达式组的要求似乎使这个问题变得棘手. This question是一个开始,但我需要在匹配的字符串中插入文本,而不是仅仅替换.
作为参考,这是我的正则表达式(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>
解决方法:
以下怎么样?
<xsl:template name="classname">
<xsl:param name="class"/>
<xsl:choose>
<xsl:when test="contains($class,'.')">
<xsl:value-of select="concat(substring-before($class,'.'),'.')"/>
<xsl:call-template name="classname">
<xsl:with-param name="class"
select="substring-after($class,'.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat('Mock',$class)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这将类名作为输入参数,并在最后的“.”之后添加“Mock”.你可以用它来调用它,例如
<xsl:call-template name="classname">
<xsl:with-param name="class" select="@class"/>
</xsl:call-template>
(我刚刚在Firefox中试了一下,你可能会发现你需要整理一些空白区.)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。