XSLT 将同名兄弟节点的值合并/连接到单个节点

2023-11-24

输入XML

<catalog>
    <product id="1">
        <name>abc</name>
        <category>aaa</category>
        <category>bbb</category>
        <category>ccc</category>
    </product>
    <product id="2">
        <name>cde</name>
        <category>aaa</category>
        <category>bbb</category>
    </product>
</catalog>

预期输出 xml

<products>
    <product>
        <id>1</id>
        <name>abc</name>
        <category>aaa,bbb,ccc</category>
    </product>
    <product>
        <id>2</id>
        <name>cde</name>
        <category>aaa,bbb</category>
    </product>
</products>

用于转换的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/catalog">
        <products>
            <xsl:for-each select="product">
                <product>
                    <id><xsl:value-of select="@id"/></id>
                    <name><xsl:value-of select="name"/></name>
                    <category><xsl:value-of select="category" /></category>
                </product>
            </xsl:for-each>
        </products>
    </xsl:template>
</xsl:stylesheet>

实际输出 xml :(

<products>
    <product>
        <id>1</id>
        <name>abc</name>
        <category>aaa</category>
    </product>
    <product>
        <id>2</id>
        <name>cde</name>
        <category>aaa</category>
    </product>
</products>

在每个“产品”下按名称“类别”循环遍历所有兄弟节点并合并/连接到以逗号分隔的单个节点所需的代码。每个产品的“类别”数量各不相同,因此数量未知。


使用定义的这个方便的连接调用模板here,这变得简单如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/catalog">
        <products>
            <xsl:for-each select="product">
                <product>
                    <id>
                        <xsl:value-of select="@id"/>
                    </id>
                    <name>
                        <xsl:value-of select="name"/>
                    </name>
                    <category>
                        <xsl:call-template name="join">
                            <xsl:with-param name="list" select="category" />
                            <xsl:with-param name="separator" select="','" />
                        </xsl:call-template>
                    </category>
                </product>
            </xsl:for-each>
        </products>
    </xsl:template>

    <xsl:template name="join">
        <xsl:param name="list" />
        <xsl:param name="separator"/>

        <xsl:for-each select="$list">
            <xsl:value-of select="." />
            <xsl:if test="position() != last()">
                <xsl:value-of select="$separator" />
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Output:

<products>
  <product>
    <id>1</id>
    <name>abc</name>
    <category>aaa,bbb,ccc</category>
  </product>
  <product>
    <id>2</id>
    <name>cde</name>
    <category>aaa,bbb</category>
  </product>
</products>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSLT 将同名兄弟节点的值合并/连接到单个节点 的相关文章

随机推荐

  • 对于大n,如何计算2^n?

    我正在尝试编写一个需要数字的程序 n 作为输入 并输出 2 次方的结果n 问题是 n可以非常大 最多 100 000 本质上 我正在尝试计算pow 2 n 对于非常大的数字 我认为做到这一点的方法是将数字存储在数组中 因为没有内置的数字类型
  • 如何使用 Google Drive API 上传 FILE_URI:插入文件

    在 Android 上 我尝试使用 Google Drive API 插入文件上传 Cordova Phonegap getPicture 的输出 有没有办法使用 FILE URI 而不是 DATA URL base64 来做到这一点 我首
  • 导入 .TLB 文件给出“无法打开源文件 x.tlh”

    我正在将 VS2010 C 项目更新到 VS2019 该项目正在导入多个 tlb 文件 对于每个文件 VS2019 都会给出一个错误 指出 无法打开 tlh 文件的源文件 其中一个来自我也升级过的 DLL 用 C 编写 在 VS2019 中
  • 如何在 ASP.NET 网站项目中使用最新的 VB.NET 语言级别?

    我的任务是对 2009 年开发的 Web 应用程序进行现代化改造 它是用 VB NET 编写的 并使用 ASP NET WebForms 我想使用 VB NET 中最新的语言结构 我得到有用的指示 说 Visual Basic 10 0 不
  • 未捕获的类型错误:对象 [object DOMWindow] 的属性“$”不是函数

    我得到一个 未捕获的类型错误 对象 object DOMWindow 的属性 不是函数我的脚本在 Chrome 中出错
  • “this”关键字如何工作以及何时使用?

    我正在寻找关于 this 关键字的作用以及如何正确使用它的清晰解释 它的行为似乎很奇怪 我不完全明白为什么 如何this工作以及什么时候应该使用它 this是 JavaScript 中的关键字 是执行上下文的属性 它的主要用途是在函数和构造
  • Zend 动作助手

    我正在学习如何使用 Zend 框架 并意识到操作助手是有用的 我已经在我的机器上设置了 Zend 的默认安装 但我不知道帮助程序文件需要放在哪里 我需要在引导程序文件中放入什么以及如何使用它 谁能给我指出正确的方向吗 ZF 用户指南对我来说
  • C# 字符串到十六进制、十六进制到字节的转换

    我有一个方法 它采用十六进制值并将其分配为纯文本 但字节类型是这样的 byte plainText 0xd7 我想从文本框中获取这个值 例如用户将在文本框中键入 d7 我将像这样分配它 byte plaintText 0xd7 我无法做到这
  • 我应该使用我的应用程序重新分发 msvcrt.dll 吗?

    如果应用程序的某些库动态依赖于 msvcrt dll 我是否应该将 msvcrt dll 与我的应用程序一起重新分发并使用私有 dll IE 系统的msvcrt dll dll hell 是否可能存在不兼容问题 应用程序针对 Windows
  • 如何实现顶层异常处理?

    最近 我必须为同事开发的现有服务开发一个附加模块 他在主工作函数中放置了一个 try catch 块 用于捕获所有冒泡到此级别的未处理异常 并将它们与堆栈跟踪信息等记录在一起 try do main work catch Exception
  • PyCUDA:设备代码中的 Pow 尝试使用 std::pow,失败

    问题或多或少说明了一切 calling a host function std pow
  • ValueError:找到具有 0 个样本的数组(形状= (0, 1),而 MinMaxScaler 要求最小值为 1

    我是机器学习的初学者 我正在帮助我的数学专业朋友基于 TensorFlow 创建一个股票预测器 csv他提供的文件 我有一些问题 第一个是他的 csv文件 该文件只有日期和结束值 它们没有分开 因此我必须手动分隔日期和值 我已经成功做到了这
  • ArrayList 的不安全或未经检查的操作

    我被指派编写一个程序 获取 100 个 0 25 之间的随机整数并将它们存储在一个数组中 然后我必须调用两种方法来分割偶数和赔率 非常典型 所以我尝试了 ArrayList 的东西 我刚刚学会它 它看起来很好 我正在关注教程和在线的东西 直
  • hibernate oracle 标识符太长 ORA-00972

    我被这个问题困扰了 数据库架构是由其他人提供的 因此我不能简单地更改名称 我尝试在各处添加正确的注释 也许我遗漏了一些东西 明显的 这是我的完整映射 相当多的类 我将提交 getter setter 问题是当休眠试图获取所有List
  • Android Service.startForeground 不尊重通知 ID 的唯一性

    Service startForeground vs 通知管理器 notify 给出不同的行为 使用时notify使用两个不同的通知 ID 创建 2 个通知 Good 当做同样的事情时启动前台 一个通知会覆盖另一个通知 Bad 测试设备 N
  • 用于纯 Firebase JavaScript API 的 orderby 对象过滤器

    I found angularFire当与纯 Firebase JavaScript API 结合使用时 总是让我感到困惑 假设我不知道如何调用 Firebase datasapshot APIss name ss hasChild ss
  • 在python中获取函数调用者的信息

    我想获取有关 python 中特定函数的调用者的信息 例如 class SomeClass def init self x self x x def caller self return special func self x def sp
  • 内存泄漏单元测试C++

    我刚刚解决了应用程序中的内存泄漏问题 现在我想编写一个单元测试以确保这种情况不会再次发生 我正在寻找一种方法来检测当前应用程序 工作集 在某些功能之前和之后的内存使用情况 例如 long mem used GetMemUsed Do som
  • Java ObjectInputStream 挂起

    我现在感觉真的很愚蠢 伙计们 基本上我是通过本地计算机上的 TCP 连接的 当我尝试在客户端创建输入 输出流时 它不会通过创建对象输入流 是什么赋予了 这在打印 2 后停止 没有异常或任何东西 这不是我第一次使用这个类 这部分是我感到困惑的
  • XSLT 将同名兄弟节点的值合并/连接到单个节点

    输入XML