XSLT 1.0:按属性分组并联接属性值

问题描述 投票:0回答:1

我有以下简化的XML数据,我想按类别ID对其进行分组,并查看有效载荷中是否有任何类似的记录,如果是的话,我想将条件与找到的元素结合起来。

<Items>
   <result>
      <id>11</id>
      <name>ABC</name>
      <condition>new</condition>
   </result>
   <result>
      <id>22</id>
      <name>XYZ</name>
      <condition>new</condition>
   </result>
   <result>
      <id>11</id>
      <name>ABC</name>
      <condition>used</condition>
   </result>
   <result>
      <id>33</id>
      <name>PQR</name>
      <condition>used</condition>
   </result>
</Items>

分组后的预期结果:

<Items>
   <result>
      <id>11</id>
      <name>ABC</name>
      <condition>new,used</condition>
   </result>
   <result>
      <id>22</id>
      <name>XYZ</name>
      <condition>new</condition>
   </result>
   <result>
      <id>11</id>
      <name>ABC</name>
      <condition>new,used</condition>
   </result>
   <result>
      <id>33</id>
      <name>PQR</name>
      <condition>used</condition>
   </result>
</Items>

我如何在XSLT 1.0中针对存在多个相似记录的大型有效负载执行此操作?使用分组方法可以吗?

当前逻辑:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sdml="http://selfhtml.org/sdml">
 <xsl:template match="/Items">
    <xsl:copy>
        <xsl:for-each-group select="result" group-by="id"> 
            <records type="{current-grouping-key()}" >
                <xsl:apply-templates select="current-group()" />
            </records>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template> 

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

当前响应:

"@type": "11",
"$": "11ABC<itemdescription>.new11ABC<itemdescription>.used"

Edit1:添加了响应Edit2:Typo Edited

xml xslt xslt-1.0 muenchian-grouping
1个回答
0
投票

因为您只想合并条件数据,但保留单独的result元素,并且也只想为您可以使用的特定ID标识组,所以>

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

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

  <xsl:key name="result-group" match="result[id = '11']/condition" use="../id"/>

  <xsl:template match="result/condition">
      <xsl:copy>
          <xsl:for-each select="key('result-group', ../id)">
              <xsl:if test="position() > 1">,</xsl:if>
              <xsl:value-of select="."/>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.