转换以删除重复项并复制其余部分

2023-12-06

我希望输出 xml 根据属性“f”针对元素“c”进行分组。这是我的输入 xml 和 xslt。我希望该组仅出现一次,其他节点应按原样复制到输出。我尝试过的 xslt 复制了整个输入 xml。因此,如果有两个或多个具有 c 元素且“f”属性值相同的元素,则希望该组的第一次出现出现在输出中。我想要的结果也被复制了。

输入 XML

<M>
   <a>
      <b>
         <c f="123">
            <d>Al</d>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
  <a>
    <b>
      <c f="123">
        <d>Al</d>
        <e NO="678">
          <f>Y</f>
          <g>
            <h>FTO</h>
          </g>
        </e>
      </c>
    </b>
  </a>
  <a>
    <b>
      <c f="567">
        <d>Al</d>
        <e NO="678">
          <f>Y</f>
          <g>
            <h>FTO</h>
          </g>
        </e>
      </c>
    </b>
  </a>
  <a>
    <b>
      <somethingelse></somethingelse>
    </b>
  </a>
</M>

想要输出 xml

<M>
  <a>
    <b>
      <c f="123">
        <d>Al</d>
        <e NO="678">
          <f>Y</f>
          <g>
            <h>FTO</h>
          </g>
        </e>
      </c>
    </b>
  </a>
  <a>
    <b>
      <c f="567">
        <d>Al</d>
        <e NO="678">
          <f>Y</f>
          <g>
            <h>FTO</h>
          </g>
        </e>
      </c>
    </b>
  </a>
  <a>
    <b>
      <somethingelse></somethingelse>
    </b>
  </a>
</M>

xslt我试过了

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="mykey" match="c"
   use="@f"/>

  <xsl:template match=
  "c[generate-id()
      =
       generate-id(key('mykey',@f)[1])
      ]
  ">



    <xsl:text/>
    <xsl:copy-of select="key('mykey',@f)[1]"/>
  </xsl:template>
  <xsl:template match="node()|@*">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

这种转变:

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

     <xsl:key name="kAByC-F" match="a" use="*/c/@f"/>

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

     <xsl:template match=
      "a[*/c
       and
         not(generate-id()
            =
             generate-id(key('kAByC-F', */c/@f)[1])
             )
        ]"/>
</xsl:stylesheet>

当应用于提供的 XML 文档时:

<M>
   <a>
      <b>
         <c f="123">
            <d>Al</d>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
  <a>
    <b>
      <c f="123">
        <d>Al</d>
        <e NO="678">
          <f>Y</f>
          <g>
            <h>FTO</h>
          </g>
        </e>
      </c>
    </b>
  </a>
  <a>
    <b>
      <c f="567">
        <d>Al</d>
        <e NO="678">
          <f>Y</f>
          <g>
            <h>FTO</h>
          </g>
        </e>
      </c>
    </b>
  </a>
  <a>
    <b>
      <somethingelse></somethingelse>
    </b>
  </a>
</M>

产生想要的正确结果:

<M>
   <a>
      <b>
         <c f="123">
            <d>Al</d>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <c f="567">
            <d>Al</d>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <somethingelse/>
      </b>
   </a>
</M>

解释:

正确使用慕尼黑分组法.

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

转换以删除重复项并复制其余部分 的相关文章

随机推荐

  • php检查数组值是否连续

    我有一个数组 dice 4 7 3 6 7 我需要一种方法来检查该数组中的每个值是否是连续的数字 有一个简单的方法可以做到这一点吗 尝试这个 dice array 4 5 2 6 7 function checkConsec d for i
  • 为什么在创建这个简单的物化视图示例时会出现 ORA-12054 错误?

    ALTER TABLE RECORDINGS ADD PRIMARY KEY ID CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING DROP MAT
  • R 中多个变量的 Shapiro-Wilk 正态性检验循环

    我有一个名为 My data 的数据集 以及三个名为 a b c 的变量 我的数据头是这样的 gt head My data variable A variable B value 1 Jul W1 18 780294 2 Jul W2 1
  • python3多进程共享numpy数组(只读)

    我不确定这个标题是否适合我的情况 我想分享 numpy array 的原因是它可能是我的情况的潜在解决方案之一 但如果您有其他解决方案也很好 我的任务 我需要实施一个迭代的算法与多重处理 而每个进程都需要有一份数据 这个数据很大 并且只读
  • 在MySQL中合并两个表之间的一列

    这是一个延续问题我上周问过 它涉及来自两个不同表的表列的组合 请考虑这个例子 我有一个包含这些值的表 vote orders a VOTE CANDIDATE RANKED CHOICE VOTES ORIGINAL VOTES 2 4 0
  • 泛型类型的模式匹配

    为什么我不能与 Node T 进行模式匹配 object Visitor def inorder T root Node T Unit root match case End gt return case Node T gt if root
  • CPack:从子目录(googletest 目录)中排除 INSTALL 命令

    我正在使用 CMake 进行项目 并使用 googletest 进行测试用例 环顾互联网 通常的做法是将 googletest 源代码复制到存储库的子文件夹中 并将其包含在 add subdirectory googletest 中 我就是
  • 文件 tesseract.exe 不存在

    我已经安装了pytesseract图书馆使用 pip install pytesseract 当我尝试使用image to text方法 它给了我一个 FileNotFoundError WinError 2 系统找不到指定的文件 我用谷歌
  • 在 Impala SQL 中编写 While 循环?

    在 Impala 中编写 while 循环的语法是什么 甚至可以写一个循环吗 我似乎无法声明变量 并且它不识别 while 作为关键字 因帕拉不支持WHILE在它的语法中循环 参考 Impala 保留字
  • React js onClick 无法将值传递给方法

    我想读取 onClick 事件值属性 但是当我点击它时 我在控制台上看到类似这样的内容 SyntheticMouseEvent dispatchConfig Object dispatchMarker 1 1 0 2 0 0 1 nativ
  • 新的 PyYAML 版本会破坏大多数自定义 python 对象 - RepresenterError

    大约5小时前 版本4 1 0被释放了 它破坏了我的单元测试 这是一个干净的 MVCE 显示了这一点 3 12版本 gt gt gt import numpy as np gt gt gt import yaml gt gt gt x np
  • 选择 cakephp 3 查询中除一个字段之外的所有字段

    我只想选择 cakephp 3 中除一个字段之外的所有字段 Ex this gt select fname lname mname email password status created modified 在这里 我想选择除创建和修改之
  • 迭代对象数组 Angular 2

    我有一个从 json 文件的服务文件中接收到的对象数组 当我在组件中订阅它并尝试迭代它时 出现以下错误 EXCEPTION Error in app dashboard features fleet fleetControlPanel fl
  • 在 python、numpy 中创建一个全零的 4d 矩阵

    我正在尝试使用以下代码在 python 中创建一个 4 维矩阵 import numpy as np rho np zeros 2 2 2 2 但我收到以下错误 rho np zeros 2 2 2 2 TypeError function
  • 如何从一个输入标签添加/上传/选择多个文件?

    我来这里是为了知道如何从一个多个输入标签添加 上传 选择多个文件 但再次选择后所有先前的选择都被删除或覆盖 我想要的是 选择多个文件 将进行预览 确定完成 用户可以从预览中删除选择 将更多文件 图像添加到当前选择 您可以隐藏输入 type
  • ORDER BY 和WITH(行锁、UPDLOCK、READPAST)

    我需要使用一些 SQL 表来设置队列系统 如所描述的那样here 也就是说 因为我需要按不同的标准过滤队列项目 所以在我正在使用的存储过程中 BEGIN TRANSACTION CREATE TABLE Temp ID INT SOMEFI
  • PhoneGap - 存储图像,然后获取其 base64 编码数据

    我正在使用 PhoneGap Camera API 拍照并使用destinationType FILE URI 这部分正在发挥作用 随后我可以采用提供的路径并将其设置为 HTML 图像的 src 然后图像就会出现 稍后在代码中 我想抓取图像
  • 使用 GCloud KMS 生成加密密钥以访问私有存储库作为依赖项时出现错误

    我正在尝试使用此将加密的 ssh 密钥添加到 google KMS文档用于访问私有存储库作为 Google App Engine Node JS 项目 的依赖项 我已成功生成 Cloud KMS KeyRing 和 CryptoKey 但在
  • 如何处理CEdit在父窗体中的鼠标点击?

    我是 MFC 的新手 来自 C 和 Java 并且正在解决问题 考虑一个包含三个文本框的对话框 我已将 CEdit 子类化为 CMyEdit 并且三个文本框连接到对话框类中的 CMyEdit 变量 我想让对话框类 知道 何时用鼠标左键单击了
  • 转换以删除重复项并复制其余部分

    我希望输出 xml 根据属性 f 针对元素 c 进行分组 这是我的输入 xml 和 xslt 我希望该组仅出现一次 其他节点应按原样复制到输出 我尝试过的 xslt 复制了整个输入 xml 因此 如果有两个或多个具有 c 元素且 f 属性值