XSLT 和 xpath v1.0 查找重复项并聚合

2024-03-09

我想知道是否有一种方法可以在 xml 中搜索重复项,然后在找到时将所有重复项聚合到一个节点。埃克斯

<car name="one">
 <person>john</person>
 <person>Jay</person>
</car>
<car name="two">
 <person>kim</person>
 <person>chris</person>
</car>
<car name="one">
 <person>jane</person>
 <person>liz</person>
</car>

应该:

<car name="one">
 <person>john</person>
 <person>Jay</person>
 <person>jane</person>
 <person>liz</person>
</car>
<car name="two">
 <person>kim</person>
 <person>chris</person>
</car>

非常感谢所有帮助!

Br Kim


在 XSLT 1.0 中,您必须使用称为慕尼黑方法 http://www.jenitennison.com/xslt/grouping/muenchian.html这是使用以下方法对元素进行分组的过程key and generate-id功能。

这个过程是这样的:

您首先定义一个键来表示要分组的数据。

<xsl:key name="car-by-name" match="car" use="@name"/>

然后,您可以通过基于该密钥生成 id 来在模板匹配中使用该密钥。

<xsl:apply-templates select="car[generate-id() = generate-id(key('car-by-name', @name)[1])]" mode="group"/>

现在您已经对节点进行了分组,您所要做的就是再次使用该键来获取该键中的所有节点。

<xsl:apply-templates select="key('car-by-name', @name)"/>

现在,当您获取此 XML(添加document使其格式良好)。

<document>
  <car name="one">
    <person>john</person>
    <person>Jay</person>
  </car>
  <car name="two">
    <person>kim</person>
    <person>chris</person>
  </car>
  <car name="one">
    <person>jane</person>
    <person>liz</person>
  </car>
</document>

并应用这个 XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:key name="car-by-name" match="car" use="@name"/>

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

  <xsl:template match="document">
    <xsl:copy>
      <xsl:apply-templates select="car[generate-id() = generate-id(key('car-by-name', @name)[1])]" mode="group"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="car" mode="group">
    <car name="{@name}">
      <xsl:apply-templates select="key('car-by-name', @name)"/>
    </car>
  </xsl:template>

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

</xsl:stylesheet>

它产生这个结果。

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <car name="one">
    <person>john</person>
    <person>Jay</person>

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

XSLT 和 xpath v1.0 查找重复项并聚合 的相关文章

随机推荐

  • C 中的图形函数

    为什么我运行代码时什么也看不到 我用的是DOSBox include
  • 如何获取当前应用程序区域设置?

    我需要获取当前区域设置 不是用户区域设置 而是我的应用程序区域设置 假设我的应用程序有两种本地化 在项目设置中 英语 默认 和法语 如果用户在 iPhone 上设置法语 那么我的应用程序将显示法语界面 如果用户在 iPhone 上设置德语
  • @Injectable(providedIn: 'root') 的语义?

    只是想确保我理解的语义 Injectable providedIn root 在 Angular 6 之前 如果我们从 NPM 导入包含服务的模块 我们会在应用程序模块中声明该模块 以便整个应用程序都可以访问该服务 像这样的事情 impor
  • 建立新的 Java 开发中心

    我正在建立一个 Java 开发商店 目前只是我自己作为唯一的开发人员 但希望随着业务的增长需要雇用其他人 显然 我希望将其设置正确 以便随着更多人的加入 他们可以立即提高工作效率 请帮助建议我想做的事情以及完成这些事情的工具 这是我认为我需
  • Django 模型继承 - 在查询中只需要父类的实例

    假设我有 2 个模型 一个是另一个的父模型 如何查询 Django 中所有不是餐厅的地点 Place objects all 将包括所有餐厅 对吗 我想将孩子排除在结果之外 谢谢你 class Place models Model name
  • 将多个不相邻列复制到数组

    我正在尝试将多个不相邻 不连续 的 Excel 列复制到数组中 但它不起作用 以下是我尝试过的 Public Function Test Dim sh As Worksheet Set sh Application Sheets MyWor
  • Response.End 之后关闭窗口

    例如我有一个表格ListView即处于编辑模式 发生了一些事情 导致列表视图正在使用的表不再可用 我只想在用户点击 保存 时能够关闭窗口 In Page Load 我检查桌子是否可用 如果没有 我打电话RegisterClientScrip
  • Visual Studio 设计器中的抽象 UserControl 继承

    abstract class CustomControl UserControl protected abstract int DoStuff class DetailControl CustomControl protected over
  • Django:如果用户是工作人员,如何排除表单字段?

    如果用户不是员工 如何排除表单字段 我尝试了这个 但没有成功 给出了一个错误 global name user is not defined class PostForm ModelForm class Meta model Photo e
  • API 来比较 AST? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个开源java api允许比较java源代码的两个抽象语法树 我想看看两个语法树之间的差异 类
  • 关键字 CONSTRAINT 在此 CREATE TABLE 语句中起什么作用

    我正在学习如何将 sqlite3 与 python 一起使用 我所关注的教科书中的示例是一个数据库 其中每个国家 地区记录都有一个地区 国家 地区和人口 书上说 以下代码片段使用 CONSTRAINT 关键字来指定 表中没有两个条目是 所创
  • 使用 Javascript 的 8 位异或校验和

    我正在尝试模仿 Windows 应用程序格式化消息并发送通过 USB 通过 UART 传输到显示该消息的设备 该应用程序计算checksum并将其粘贴到消息后面 否则设备将不会接受该命令 校验和不是 crc8 校验和 但它是什么 使用 US
  • 使用 powershell 从路径获取最新创建的文件夹

    如何使用 Windows PowerShell 从路径获取最新创建的文件夹 我有路C temp我想在此路径中找到最近创建的文件夹 PowerShell 主要与管道一起工作 因此您编写的大部分内容将包括创建表示某些信息的对象 以及过滤和操作它
  • 查找最近一小时内产生的记录

    我有一个smalldatetime字段命名myTime创建记录时进行记录 我需要选择过去一小时内创建的记录的语法 我认为会是 and DATEDIFF hh datePart hh myTime DatePart hh GETDATE lt
  • 是否可以保留自定义元素的内部 html?

    使用自定义元素 我想对自定义元素内的元素进行样式设置 但是当我定义该元素时 除了影子 dom 之外的所有内容都会消失 如何将内容从元素移动到 Shadow dom 我已经有一个包装元素 div class wrapper 在阴影内 但尝试使
  • Keras:将预测与使用标准化数据训练的模型结合使用?

    我正在 Keras 中创建一个深度神经网络 以使用表格数据执行 NN 回归 最佳实践是标准化输入和输出序列 我也想使用predict函数提供各种输入集的模型输出估计 如果训练数据已标准化 我想我还需要标准化predict使用相同的缩放参数的
  • 温莎城堡延迟加载服务

    有时 我发现自己处于这样的情况 只有在满足特定条件时才需要解决服务 例如 用户可以选择发送电子邮件或短信通知 我想根据用户的选择来延迟加载电子邮件或短信服务 这样我就不必同时加载它们并浪费资源 例如 如果用户有 10 个选项怎么办 我遇到的
  • Node.js Express - 如何将 Stylus .styl 文件编译为 CSS

    我正在尝试从 Balloons http balloons io 开始构建一个应用程序 它使用 Backbone js 和 Express 来设置 UI 我从未使用过这些框架 而且我很难真正做出改变 据我了解 styl 文件被编译成 CSS
  • /etc/lsb-release 与 /etc/os-release

    我需要使用 bash 找出我正在运行的 Linux 发行版 成立这一页 https www cyberciti biz faq find linux distribution name version number 这非常有帮助 但是我的系
  • XSLT 和 xpath v1.0 查找重复项并聚合

    我想知道是否有一种方法可以在 xml 中搜索重复项 然后在找到时将所有重复项聚合到一个节点 埃克斯