社区首页 >问答首页 >如何使用XSLT合并XML元素,然后以相同的名称/类型构造元素/属性?

如何使用XSLT合并XML元素,然后以相同的名称/类型构造元素/属性?
EN

Stack Overflow用户
提问于 2022-09-15 02:44:13
回答 1查看 43关注 0票数 0

主要议题

我有一个XML文件,它有多个类似的元素,信息略有不同。因此,假设我有两个元素,具有相同的X属性,但不同的Y属性。下面是一个示例:

代码语言:javascript
代码运行次数:0
复制
<FILE>
  <ELEMENT>
    <ATTRIBUTEX>1</ATTRIBUTEX>
    <ATTRIBUTEY>A</ATTRIBUTEY>
  </ELEMENT>
  <ELEMENT>
    <ATTRIBUTEX>1</ATTRIBUTEX>
    <ATTRIBUTEY>B</ATTRIBUTEY>
  </ELEMENT>
</FILE>

我想要做的是--基于两个元素具有相同的X属性的事实--将它们合并为一个具有一个属性X和多个子元素(相同类型)的元素--每个元素都包含每个不同的属性Y。因此,例如,我希望我的文件以这样的方式结束:

代码语言:javascript
代码运行次数:0
复制
<FILE>
  <ELEMENT>
    <ATTRIBUTEX>1</ATTRIBUTEX>
    <NEWELEMENT>
      <ATTRIBUTEY>A</ATTRIBUTEY>
    </NEWELEMENT>
    <NEWELEMENT>
      <ATTRIBUTEY>B</ATTRIBUTEY>
    </NEWELEMENT>
  </ELEMENT>
</FILE>

可能的解决方案?

一个可能的解决方案,我可以想到,但缺乏执行的知识,是由两个步骤组成:

首先,我可以合并所有包含X属性的元素,这样信息至少在一个地方。我不太知道如何完成this.

  • Secdonly,,这就打开了--理论上--用XSLT的知识来重新构造元素.

问题及其可能的解决方案

但是,一旦将包含在X属性中的所有元素合并在一起(第一步),我将有一个文件,其中有同名的属性(特别是Y属性)。下面是一个示例:

代码语言:javascript
代码运行次数:0
复制
<FILE>
  <ELEMENT>
    <ATTRIBUTEX>1</ATTRIBUTEX>
    <ATTRIBUTEY>A</ATTRIBUTEY>
    <ATTRIBUTEY>B</ATTRIBUTEY>
  </ELEMENT>
</FILE>

这意味着--至少据我所知--当我在上面的XML (第二步)上执行XSLT文件时,当将它们排序到两个新的子元素(NEWELEMENT)时,它不能区分这两个Y元素。

因此,假设我对上面的XML执行以下XSLT:

代码语言:javascript
代码运行次数:0
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="FILE">
  <Record>
    <xsl:for-each select = "ELEMENT">
      <ELEMENT>
        <xsl:copy-of select="ATTRIBUTEX"/>
      
        <NEWELEMENT>
          <xsl:copy-of select="ATTRIBUTEY"/>
        </NEWELEMENT>
        
        <NEWELEMENT>
          <xsl:copy-of select="ATTRIBUTEY"/>
        </NEWELEMENT>

      </ELEMENT>
    </xsl:for-each> 
  </Record>
</xsl:template>
</xsl:stylesheet>

产出如下:

代码语言:javascript
代码运行次数:0
复制
<Record>
    <ELEMENT>
        <ATTRIBUTEX>1</ATTRIBUTEX>
        <NEWELEMENT>
            <ATTRIBUTEY>A</ATTRIBUTEY>
            <ATTRIBUTEY>B</ATTRIBUTEY>
        </NEWELEMENT>
        <NEWELEMENT>
            <ATTRIBUTEY>A</ATTRIBUTEY>
            <ATTRIBUTEY>B</ATTRIBUTEY>
        </NEWELEMENT>
    </ELEMENT>
</Record>

如您所见,XSLT已经获取了所有和任何ATTRIBUTEY元素,并将它们放入每个NEWELEMENT中,而不是区分它们,在第一个NEWELEMENT中放置一个ATTRIBUTEY,在第二个NEWELEMENT中放置第二个ATTRIBUTEY。我需要一个XSLT文件,该文件就是这样做的,正如前面所述,它生成的XML如下所示:

代码语言:javascript
代码运行次数:0
复制
<FILE>
  <ELEMENT>
    <ATTRIBUTEX>1</ATTRIBUTEX>
    <NEWELEMENT>
      <ATTRIBUTEY>A</ATTRIBUTEY>
    </NEWELEMENT>
    <NEWELEMENT>
      <ATTRIBUTEY>B</ATTRIBUTEY>
    </NEWELEMENT>
  </ELEMENT>
</FILE>

有人能帮我吗?任何从第一个示例文件生成所需输出(上面)的解决方案都将不胜感激!如果该解决方案遵循步骤一和步骤二,这将是一个额外的好处。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-09-15 04:40:28

我正在从下面的XSLT3.0中获得您所请求的输出。

只是事先做了几个笔记:

  1. 提到了属性,但实际上,所有内容都是您的XML中的一个元素。在XML意义上没有属性。
  2. --我真的不认为需要创建附加的子元素。您可以有一个同名的元素列表.

尽管如此,作为样式(工作表)的练习,这里有一个样式表,它从给定的输入中产生输出:

代码语言:javascript
代码运行次数:0
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/FILE" >
    <FILE>
      <xsl:for-each-group select="*" group-by="name(.)" >
        <xsl:variable name="parentName" as="xs:string" select="current-grouping-key()" /> 
        
        <xsl:variable name="childNamesSameValues" as="xs:string*" >
          <xsl:for-each-group select="current-group()/*" group-by="name(.)" >
            <xsl:if test="count(distinct-values(current-group()/text())) eq 1">
              <xsl:sequence select="current-grouping-key()" />
            </xsl:if>
          </xsl:for-each-group>
        </xsl:variable>
            
        <xsl:element name="{$parentName}" >
          <xsl:for-each-group select="current-group()/*" group-by="name(.)" >
            <xsl:choose>
              <xsl:when test="current-grouping-key() = $childNamesSameValues">
                <xsl:copy-of select="current-group()[1]" />
              </xsl:when>
              <xsl:otherwise >
                <xsl:for-each select="current-group()" >
                  <xsl:element name="NEW{$parentName}" >
                    <xsl:copy-of select="." />
                  </xsl:element>
                </xsl:for-each>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:for-each-group>
        </xsl:element>
      </xsl:for-each-group>
    </FILE>
  </xsl:template>
  
</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73729724

复制
相关文章
Firebase 如何创建登录 Token
Firebase 的 token 可以使用 firebase 命令行工具来进行创建。
HoneyMoose
2021/04/02
2.5K0
Firebase 如何创建登录 Token
Google 的 Firebase 如何删除项目
https://www.ossez.com/t/google-firebase/13792
HoneyMoose
2021/11/02
3.2K0
Google 的 Firebase 如何删除项目
firebase怎么用_firebase是什么
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168361.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
4.2K0
firebase怎么用_firebase是什么
ETCD存储满了如何处理?
当运行 ETCD 日志报 Erro: mvcc database space exceeded 时,说明ETCD存储不足了(默认ETCD存储是2G),配额会触发告警,然后 Etcd 系统将进入操作受限的维护模式。
YP小站
2022/12/01
2.8K1
如何将你的Hexo博客部署到Google Firebase上
博主最近在 白嫖万恶的资本 将博客部署到新的CDN上,所以在寻找免费的静态Web应用部署工具,发现了Google Firebase。
pai233
2022/04/26
1.3K0
如何将你的Hexo博客部署到Google Firebase上
Android Firebase 服务简介
Firebase初步了解 什么事Firebase? Firebase成立于2011年,在被Google收购之前,Firebase是一个协助开发者快速构建App,能够提供行动应用专用开发平台及SDK的一款产品,简单的说大概就是一套集成后台服务工具。早在2014年,谷歌收购了Firebase,这主要是一种面向应用程序开发人员的数据库。Firebase基本上向广大的应用程序开发人员提供不同的服务,比如存储、消息传递、通知和身份验证等服务。 在今年的I/O大会上,谷歌发表了新版的Firebase,新的Firebas
xiangzhihong
2018/02/05
22.8K0
Android  Firebase 服务简介
如何将firebase应用转为supabase应用(之一)
用supabase实时数据库替换mapus协作地图里的firebase_q平面人的博客-CSDN博客
hotqin888
2022/11/16
5.5K0
与 FireBase 亲密接触
正常的 App 都是属于网络应用,数据都是从服务器上获取的。这就需要有专业的后台开发人员开发后台业务服务器,然后为我们 App 提供数据。自从云出现之后,各大云主机厂商提供了一个云服务 PAAS(Platform-as-a-Service的缩写),意思是平台即服务。PaaS是一个执行代码以及管理应用运行环境的开发平台,用户通过SVN或者Git之类的代码版本管理工具与平台交互。但这也是开发人员具备后台开发的能力。因此,
猴哥yuri
2018/08/16
16K0
我们弃用 Firebase 了
作者 | John Considine 译者 | 平川 策划 | 刘燕 我们已经在 Firebase 上发布了 10 几款应用程序,几乎用到了该平台每个方面的特性,并设计了一个可以实现优雅扩展的手册。可以说,事实已经证明,Firebase 对 K-Optional Software 而言是非常宝贵的工具。 就在 2022 年 3 月,我们的开发人员还在为 Firebase Extensions 等创新欢呼。遗憾的是,过去几个月的三个主要变化破坏了开发体验,因此,在新项目中,K-Optional 将
深度学习与Python
2023/03/29
32.7K0
我们弃用 Firebase 了
C++如何处理图的存储方式
稀疏图,就是点数的平方与边数差的特别多,边数少,但点数多,就不行了,因为空间占用太大了。
苏州程序大白
2022/04/14
4340
C++如何处理图的存储方式
POSTGRESQL 如何存储树形数据 处理树形数据
树形数据是一种什么体现,形式, 这里先提前的展示一下,为下面的postgresql操作树形数据做一个铺垫.
AustinDatabases
2020/07/01
3.1K0
爬虫异常处理之如何处理连接丢失和数据存储异常
在爬虫开发过程中,我们可能会遇到各种异常情况,如连接丢失、数据存储异常等。本文将介绍如何处理这些异常,并提供具体的解决代码。我们将以Python语言为例,使用requests库进行网络请求和sqlite3库进行数据存储。
华科云商小徐
2023/08/28
2430
Spring Boot 与 Kotlin 上传文件
如果我们做一个小型的web站,而且刚好选择的kotlin 和Spring Boot技术栈,那么上传文件的必不可少了,当然,如果你做一个中大型的web站,那建议你使用云存储,能省不少事情。
全科
2018/08/15
9830
做什么样的软件系列之Firebase
为什么要写这一篇? 做为一个iOS开发者我没有精力自己实现一套,登陆系统后台,广告系统后台,自己尝试写过身份认证系统,但是忘记密码之类的写的又丑又简陋。同时写后端和app又不能兼顾。
于欣轩
2018/05/25
4.4K0
如何应对高频监控?利用预处理和仅存储趋势数据
当我们在监控环境中,构建高频率监控时,有许多设计选择需要考虑。要考虑如何减少性能影响?存储空间的数据保留策略是什么?有哪些现成的功能可以解决这些潜在的问题?
Zabbix
2022/06/14
5090
如何应对高频监控?利用预处理和仅存储趋势数据
Kubernetes 的网络、存储和运行时该如何处理?
技术的发展,总是解决了现有的问题,进而引入新的问题,继而继续解决,如此周而复始,Docker 公司在2013年成立,将容器的概念迅速扩散。正如当年集装箱点燃了全球的货运革命一样,当时的船运公司使用这种大型的金属集装箱替代了过去纷杂的货运装置,以适应在卡车、船舶、铁路三者之间匹配。装什么无所谓,重要的是装载本身有了标准。和现实世界的集装箱运输一样,Linux 容器创建了对于应用最为基本的封装,使之可以运行在任何的基础设施平台上。一时之间,容器风靡世界。到今天为止,几乎所有的企业都有意愿将他们的应用跑在容器之上,即使是他们自己的内部的服务器,也同样在考虑。尽管容器仅仅是管理现代的应用程序的一种更好的方式,因为它们通常被分割成无数的组件(微服务),但仍然需要能够在服务器之间进行容易的移植和访问。
CNCF
2019/12/04
1.3K0
Kubernetes 的网络、存储和运行时该如何处理?
对象存储COS媒体处理实践
如何让自己的产品更好的提供音视频服务,如何使音视频文件适配众多终端设备,适配各种网络环境,如何方便快捷的对音视频文件进行处理,这些问题成为巨大的挑战。
用户4693941
2021/02/22
1.3K0
[SpingBoot guides系列翻译]文件上传
mkdir -p src/main/java/hello,其实也就是在IntelliJ里面新建一个空的Java项目,然后添加一个main.java.hellopackage。
_淡定_
2019/05/15
10.2K0
[SpingBoot guides系列翻译]文件上传
flutter中多flavors方案以及添加firebase​
有想做海外市场的同学们,可能需要用到firebase。今天我们讲讲怎么使用「FlutterFire CLI」添加 firebase以及如何设置「flavors」
用户1974410
2022/09/20
9.9K0
flutter中多flavors方案以及添加firebase​
点击加载更多

相似问题

Firebase StorageException下载时

24

Firebase E/ StorageException :发生StorageException。位置处不存在对象

129

Firebase - StorageException: StorageException已发生,->对象在位置上不存在

17

已发生StorageException。位置处不存在对象。存储FireBase

93

即使我处理它,firebase StorageException也会打印出来

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文