我有一个 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>
我希望结果是:
<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,而 XSLT 2.0 是正则表达式支持所必需的。
所以我的问题是,使用古老的 JAXP XSLT 1.0 API 实现此目的的最佳方法是什么?也就是说,不使用正则表达式。我寻找类似的问题,但反向引用正则表达式组的要求似乎使这成为一个棘手的问题。这个问题 https://stackoverflow.com/questions/3025136/how-to-replace-text-defined-in-a-given-tag-or-element-using-xslt-xslt-string-rep是一个开始,但我需要insert文本,在匹配的字符串中,而不仅仅是替换.
作为参考,这是我的正则表达式(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 中快速尝试了一下,您可能会发现需要对空白区域进行一些整理。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)