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

2024-01-07

我有一个 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(使用前将#替换为@)

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

随机推荐

  • 即使文件存在,Laravel 文件上传也需要验证触发

    我有一个表单 一个字段用于名为的文件attachment 在我的请求中 该字段的验证要求当另一个字段名为requestType设置为值sick通过使用required if验证规则 我面临的问题是 即使我为相关输入字段上传文件 请求类中的验
  • 获取数字的最后一位数字

    我需要定义一个数字的最后一位数字并将其分配给值 之后 返回最后一位数字 我的代码片段无法正常工作 Code public int lastDigit int number String temp Integer toString numbe
  • 在数字之间添加空格

    我正在尝试输入数字 我已经让我的文本框仅通过以下代码接受数字 function isNumber evt evt evt evt window event var charCode evt which evt which evt keyCo
  • Realm Swift 0.92.3“运行脚本阶段”不起作用

    尝试使用新的realm swift 0 92 3 我无法让这个 运行脚本阶段 工作 我按照以下指示进行操作here http realm io docs swift latest 根据说明 我的运行脚本条目是 见下图 不幸的是 我在尝试编译
  • 无法检索无法识别的元素提供者的元数据

    每当我尝试使用实体框架模板添加控制器时 都会收到消息错误 但我不断收到错误消息 unable to retrieve metadata for path unrecognized element providers C Users user
  • 如何在 Objective-c 中编写 ok 按钮动作?

    我是新来的xcode questions tagged xcode 我创建了一个对话框 并在对话框上创建了 确定 按钮 现在 我正在对对话框进行一些操作 之后我想单击 确定 按钮关闭对话框 为此我正在做这样的事情 在 h文件中 interf
  • 如何通过longPressGestureRecognizer获取button.tag?

    我正在动态地将图像按钮添加到某些滚动视图中 它们都指向一个 longPressHandler 现在 我如何知道按下了哪个按钮 sender tag 为我提供了添加到按钮的 longGestureRecognizer 标签 我无法手动设置该标
  • jquery UI 对话框:如何在没有标题栏的情况下初始化?

    是否可以打开没有标题栏的 jQuery UI 对话框 我认为最好的解决方案是使用该选项dialogClass jquery UI 文档摘录 在初始化期间 selector dialog dialogClass noTitleStuff 或者
  • 当 input[type="date"] 处于焦点时如何显示日历弹出窗口

    有没有办法在输入元素的焦点上激活本机 HTML5 日期选择器下拉菜单 大输入元件 目前 我只能通过单击输入元素最右侧的箭头来使用日历 大输入元素单击箭头 我想在输入元素的焦点上激活此日历 这是有问题的代码
  • 如何设置 h:selectOneRadio 按钮的默认值

    我无法设置 h selectOneRadio 的默认值 因为我需要预先选择单选按钮
  • Typo3:8.7.9 CKeditor 保存后删除块样式

    我在 Typo3 中有以下 CKEditor 的 YAML 配置 Load default processing options imports resource EXT rte ckeditor Configuration RTE Pro
  • 捕获多个异常并重新抛出一般异常

    我使用反射将一些数据添加到第三方库中的类内的私有变量中 一路上大约有四种不同的异常可以抛出 所有这些都与反射有关 而且所有这些都不太可能发生 我正在对所涉及的类和变量的名称进行硬编码 我不太可能收到任何未找到类或未找到字段的错误 除非图书馆
  • 如何在屏幕上显示PIL图像?

    我正在使用 PIL 库进行一些图像编辑 关键是 我不想每次都将图像保存在硬盘上以便在资源管理器中查看 是否有一个小模块可以让我简单地设置一个窗口并显示图像 从接近年初开始PIL教程 https web archive org web 202
  • 导入酶后加载模块 DomUtils 时出现 Webpack 错误

    我有一个使用 TypeScript 和 React 0 14 的项目 我用 karma mocha chai 设置了测试环境 以及它的工作 但是当我导入并使用酶中的函数时 我在浏览器中收到错误 来自 Chrome 的人类可读错误 Uncau
  • 将 ipad 应用程序转换为在 iPhone 上运行(通用应用程序)

    我有一个可以运行的 iPad 应用程序 现在需要在 iPhone 上运行它 我已经阅读了相当多的内容 但还没有找到一个好的答案 在这个网站上 我看到了一些讨论 但同样没有明确的答案 有谁知道有什么教程吗 我已经在我的代码中捕获了它是否是 i
  • 如何更改Flutter应用程序的名称?

    我刚刚按照以下说明制作了一个 Flutter 应用程序这一页 https codelabs developers google com codelabs first flutter app pt2 0 我用谷歌搜索了如何更改应用程序的名称
  • Java迭代固定长度的数组并使用Scanner类获取值

    如何使用固定长度为 2 的 Scanner 类获取 java 数组的值 并且它将迭代直到其值等于给定值 例如 对于以下输入 A G N H D F 我使用 Scanner 类编写了一个 for 循环来获取固定数组 road 的值 其中长度为
  • logcat 中的 Android SELinux 错误

    我的 logcat 中不断出现这些奇怪的错误 我不仅不知道它们的含义 而且不知道是什么原因造成的 它们在我的应用程序首次启动时出现 gt E SELinux 8163 Function selinux android load priori
  • SHA-1 哈希值可以全零吗?

    是否有任何输入 SHA 1 将计算为四十个零的十六进制值 即 0000000000000000000000000000000000000000 是的 这几乎是不可能的 IE 2 160 分之一 即 0 0000000000000000000
  • 如何使用 XSLT v1.0 而不是使用 XSLT v2.0 正则表达式插入文本?

    我有一个 xml 文件 它描述 除其他外 具有描述完全限定 java 类名的属性值的元素 我正在尝试编写一个 XSLT 转换来修改此文件中描述的类名 以便 例如 出现com example MyClass会变成com example Moc