微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用XSLT v1.0而不是使用XSLT v2.0正则表达式插入文本?

我有一个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 举报,一经查实,本站将立刻删除。