修改部分XML元素名称并替换为增量编号

2023-12-23

是否可以使用 XSLT 将部分元素名称更改为带有增量编号的另一个元素名称。

就像我只想更改以 UPC_ 开头的元素名称

<product>
    <UPC_US>123</UPC_US>
    <UPC_UK>223</UPC_UK>
    <UPC_JP>345</UPC_JP>
    <other>unchange</other>
</product>
<product>
    <UPC_US>1234</UPC_US>
    <UPC_CA>1235</UPC_CA>
    <other>unchange</other>
</product>

to this?

<product>
    <UPC_1>123</UPC_1>
    <UPC_2>223</UPC_2>
    <UPC_3>345</UPC_3>
    <other>unchange</other>
</product>
<product>
    <UPC_1>1234</UPC_1>
    <UPC_2>1235</UPC_2>
    <other>unchange</other>
</product>

使用 XSLT 可以很容易地实现这一点。首先,您将创建一个模板来匹配以开头的元素UPC

<xsl:template match="product/*[starts-with(local-name(), 'UPC')]">

然后,您将根据元素的位置使用修改后的名称创建一个新元素

<xsl:element name="UPC_{position()}">

请注意此处在创建名称时使用“属性值模板”。大括号表示这是一个要计算的表达式,而不是按字面意思输出。

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="product/*[starts-with(local-name(), 'UPC')]">
      <xsl:element name="UPC_{position()}">
         <xsl:apply-templates select="@*|node()"/>
      </xsl:element>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

应用 XML 后,输出如下

<products>
   <product>
      <UPC_1>123</UPC_1>
      <UPC_2>223</UPC_2>
      <UPC_3>345</UPC_3>
      <other>unchange</other>
   </product>
   <product>
      <UPC_1>1234</UPC_1>
      <UPC_2>1235</UPC_2>
      <other>unchange</other>
   </product>
</products>

话虽如此,只有当您的 UPC 元素始终是第一个元素时,它才有效。如果你有这个作为输入

<product>
    <UPC_US>123</UPC_US>
    <UPC_UK>223</UPC_UK>
    <UPC_JP>345</UPC_JP>
    <other>unchange</other>
</product>

输出将是这样的

<products>
   <product>
      <UPC_1>123</UPC_1>
      <UPC_2>223</UPC_2>
      <other>unchange</other>
      <UPC_4>345</UPC_4>
   </product>
</products>

如果这不是您想要的,您可以使用xsl:数字来计算元素的数量。试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="product/*[starts-with(local-name(), 'UPC')]">
      <xsl:variable name="count">
         <xsl:number count="*[starts-with(local-name(), 'UPC')]"/>
      </xsl:variable>
      <xsl:element name="UPC_{$count}">
         <xsl:apply-templates select="@*|node()"/>
      </xsl:element>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

在这种情况下,第二个例子将产生这个

<products>
    <product>
        <UPC_1>123</UPC_1>
        <UPC_2>223</UPC_2>
        <other>unchange</other>
        <UPC_3>345</UPC_3>
    </product>
</products>

在这两种情况下,请记下使用身份转换模板按原样复制所有其他元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改部分XML元素名称并替换为增量编号 的相关文章

随机推荐

  • Javascript - onerror 事件在 Firefox 中不起作用

    img src 这个非常简单的 onerror 事件处理程序会在找不到图像时隐藏图像 它在 Chrome 中按预期工作 但在 Firefox 中 它什么也不做 这是一个 jsFiddle 您可以尝试在 Chrome 和 Firefox 中运
  • 在flutter中将小部件封装在它自己的类中?

    我正在尝试创建一个tile for my listview 虽然图块在放置在列表视图文件中时可以工作 但我想知道如何封装tile小部件到它自己的类文件中 具体来说 如果tile对象不接受参数 我可以简单地扩展一个无状态小部件并调用build
  • 通过 CSS 属性“transform:scale(0.5)”进行缩放的 Angular CDK 拖放无法按预期工作

    通过 CSS 属性 transform scale 0 5 进行缩放的 Angular CDK 拖放无法按预期工作 如果外层 DIV 按 CSS 属性缩放 变换 比例 0 5 拖动与鼠标指针未正确对齐 一旦标度不等于 1 就会发生这种情况
  • 法拉第超时

    我已经在线搜索了文档和其他地方 似乎无法想出为法拉第设置超时选项的正确方法 有人有答案吗 我试过了 conn FaradayStack build url conn headers user agent AppConfig user age
  • 使用Phantom.js评估,如何获取页面的HTML?

    page evaluate function return document function result console log result next 结果实际上是一个巨大的物体 我不知道该对象的属性和属性 我只想要页面的 HTMLa
  • R 中 3 个分类变量和 1 个连续变量的 SE 点图

    我正在尝试生成一个点图 其中包含具有三个分类变量 mea tre 和 sex 的设计中单个测量值 len 的值 I ve produced a plot that has all I m looking for split across s
  • Google 地图 v3:大尺寸标记

    我需要在地图上显示标记 它运行良好 唯一的问题是它们看起来太小了 如何确保所使用的标记尺寸较大并且几乎在任何缩放状态下都可以看到 为了使图标更大 我绝对建议使图标图像更大 例如 要使用缩小的高分辨率图标修复高 dpi 移动设备上的像素图标
  • 打开 Storyboard 时 Xcode 8 挂起/无响应

    我最近升级到了 Xcode 8 并将我的项目更新到了 Swift 3 一段时间内一切都运行良好 故事板加载一直很慢 即使仍然运行 Xcode 7 并且与 Xcode 8 几乎一样 慢 我一直以为这是因为我使用的是较旧的 2011 年末 Ma
  • git-log 和 git-whatchanged 之间的区别?

    Given 这个答案 https stackoverflow com a 280140 10608另一个问题 以及 鉴于两者的手册页git log http linux die net man 1 git log and git whatc
  • 字符串文字作为方法的参数

    Java 中的任何字符串文字都是类型的常量对象String并存储在字符串文字池中 Will String作为参数传递给方法的文字也存储在String文字池 例如当我们写的时候 System out println Hello OR anyo
  • Bootstrap3 Affix 中的 data-offset-bottom

    我想从我的附加元素中设置 停止 例如投票http 9gag com http 9gag com 它滚动直到其父容器 我为此使用了affix 我发现了 data offset bottom 属性 没有太多记录 div class homepa
  • IE JQuery 就绪功能不起作用

    显然很多人都遇到过这个问题 但我还没有找到有效的解决方案 我有一些代码需要在页面加载后运行 因此我将其粘贴在以下块中 document ready function alert Running initialization initiali
  • 使用端口 80 时 Apache 服务失败(“繁忙”)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何配置 Apache 服务器在端口 80 上运行 我的 Apache 服务在使用端口 80 时失败 它说BUSY 当我将配置中的端口更改
  • 通过 JSch shell 执行多个命令

    我试图使用 JSch 库通过 SSH 协议执行多个命令 但我似乎陷入困境 找不到任何解决方案 这setCommand 方法每个会话只能执行单个命令 但我想像Android平台上的connectbot应用程序一样顺序执行命令 到目前为止我的代
  • 批量上传大图片到cloudinary

    有没有办法将图像批量上传到我的 cloudinary 帐户 我希望一次导入 100 张图像 每张图像 3MB 谢谢 您可以使用Cloudinary的上传API来一张一张上传图片 这是 Python 中的示例上传代码 https github
  • Xcode 8 beta 6:main.swift 无法编译

    我们有一个自定义的 UIApplication 对象 所以我们的 main swift 是 import Foundation import UIKit UIApplicationMain Process argc Process unsa
  • 通过 Azure DevOps 中的 EFCore 迁移更新 postgreSQL DB

    在Azure DevOps中 我用来更新的方式SQL服务器数据库使用 Entity Framework Core 使用两个任务 在我的构建管道中 这个任务 https github com pekspro EF Migrations Scr
  • HTML5中拖动时如何更改光标图标?

    当用户拖动 DIV 以下示例中的红色 div 时 我需要设置光标图标 我尝试过几次尝试 包括使用 CSScursor move and event dataTransfer dropEffect没有成功 因为图标总是显示 交叉圆圈 有什么想
  • ES6中使用嵌套类模拟命名空间

    我有一个文件 Services js我正在尝试将所有个人服务加载到其中 这些服务作为单例公开 Services js var Services export default Services 然后我希望示例服务嵌套在服务下 这样我就可以调用
  • 修改部分XML元素名称并替换为增量编号

    是否可以使用 XSLT 将部分元素名称更改为带有增量编号的另一个元素名称 就像我只想更改以 UPC 开头的元素名称