加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在xml / xslt中对相同节点的子组进行分组/合并

发布时间:2020-12-16 23:18:05 所属栏目:百科 来源:网络整理
导读:我是XSLT的新手,手动更改它需要花费很多时间. GroupData ID="xxx" Key="4" Temp="yyy" ItemData ID="zzz" Value="3"//GroupDataGroupData ID="xxx" Key="4" Temp="yyy" ItemData ID="www" Value="1982"//GroupData 我希望将这些多个GroupData节点的子节点放
我是XSLT的新手,手动更改它需要花费很多时间.

<GroupData ID="xxx" Key="4" Temp="yyy">
 <ItemData ID="zzz" Value="3"/>
</GroupData>

<GroupData ID="xxx" Key="4" Temp="yyy">
 <ItemData ID="www" Value="1982"/>
</GroupData>

我希望将这些多个GroupData节点的子节点放在同一个组中,即

<GroupData ID="xxx" Key="4" Temp="yyy">
 <ItemData ID="zzz" Value="3"/>
 <ItemData ID="www" Value="1982"/>
</GroupData>

所以我需要在GroupData的ID和Key属性上合并/组合/匹配它们(这些属性在文件中有所不同).还有一些没有Key属性.我怎样才能做到这一点?我读了一些其他的线程(例如,在C#中,但我没有这个可供我使用),我检查了W3学校,但这些都是非常基本的例子.我正在使用最新的XML Tools 2.3.2 r908 unicode(beta4)for Notepad来应用可能的转换(不知道它是否支持XSLT2.0或XSLT1.0).

编辑:尝试下面的建议和我遇到的各种事情,因为它有多个级别,可能没有唯一的ID:
????
????????
????????????
????????????
????????????
????????????????????????
????????????????????????????
????????????????????????
????????????????????
????????????????????
????????????????????????…

解决方法

这个XSLT 1.0转换:

<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="kGDByIdKey" match="GroupData"
  use="concat(@ID,'+',@Key)"/>

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

 <xsl:template match=
 "GroupData
    [generate-id()
    =
     generate-id(key('kGDByIdKey',concat(@ID,@Key))[1])
     ]">
    <xsl:copy>
      <xsl:apply-templates select=
       "@*|key('kGDByIdKey',@Key))/node()"/>
    </xsl:copy>
 </xsl:template>

  <xsl:template match="GroupData"/>
</xsl:stylesheet>

应用于此XML文档时:

<t>
    <GroupData ID="xxx" Key="4" Temp="yyy">
        <ItemData ID="zzz" Value="3"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="abc" Value="3"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="pqr" Value="1982"/>
    </GroupData>
    <GroupData ID="xxx" Key="4" Temp="yyy">
        <ItemData ID="www" Value="1982"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="def" Value="1982"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="tuv" Value="1982"/>
    </GroupData>
</t>

产生想要的,正确的结果:

<t>
   <GroupData ID="xxx" Key="4" Temp="yyy">
      <ItemData ID="zzz" Value="3"/>
      <ItemData ID="www" Value="1982"/>
   </GroupData>
   <GroupData ID="yyy" Key="4" Temp="yyy">
      <ItemData ID="abc" Value="3"/>
      <ItemData ID="def" Value="1982"/>
   </GroupData>
   <GroupData ID="zzz" Temp="yyy">
      <ItemData ID="pqr" Value="1982"/>
      <ItemData ID="tuv" Value="1982"/>
   </GroupData>
</t>

说明:

正确使用Muenchian grouping method和identity rule.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读