首页 > 解决方案 > XSLT 对节点的重复元素进行分组并作为请求传递

问题描述

我得到多个ReplyDTO 节点和重复的estimateNo 字段。要求是,我们必须找出我们是否得到任何重复的estimateNo,如果我们得到任何重复的estimateNo,则检查该特定节点“ReplyDTO”的creationDate 和creationTime 并获取最新的估计数。

如何使用 xslt 在此处获取估计数字?

样本有效载荷:

<replyelement xmlns:ns1="http://some.url">
    <ns1:ReplyDTO>                               
        <ns1:creationDate>20160404</ns1:creationDate>
        <ns1:creationTime>094843</ns1:creationTime>
        <ns1:estimateNo>1234</ns1:estimateNo>
        <ns1:versionNo>006</ns1:versionNo>
    </ns1:ReplyDTO>    
    <ns1:ReplyDTO>                       
        <ns1:creationDate>20160404</ns1:creationDate>
        <ns1:creationTime>094844</ns1:creationTime>
        <ns1:estimateNo>5678</ns1:estimateNo>
        <ns1:versionNo>006</ns1:versionNo>
    </ns1:ReplyDTO>    
    <ns1:ReplyDTO>                        
        <ns1:creationDate>20160404</ns1:creationDate>
        <ns1:creationTime>094843</ns1:creationTime>
        <ns1:estimateNo>5678</ns1:estimateNo>        
        <ns1:versionNo>006</ns1:versionNo>
    </ns1:ReplyDTO>
    <ns1:ReplyDTO>
        <ns1:creationDate>20160404</ns1:creationDate>
        <ns1:creationTime>094843</ns1:creationTime>
        <ns1:estimateNo>1234</ns1:estimateNo>        
        <ns1:versionNo>006</ns1:versionNo>
    </ns1:ReplyDTO>
</replyelement>

标签: xslt

解决方案


下面的 XSLT-2.0 模板复制了每个ns1:estimateNo元素的最新版本。不幸的是,您的示例不是一个很好的示例,因为所有示例都ns1:ReplyDTO具有相同的ns1:creationDate. 因此,如果日期相同,则选择基于ns1:creationTime,数字最大的优先。这是通过 中的两个xsl:sorts 实现的perform-sort。选择它选择的current-group()所有不同ns1:estimateNo元素 - 排序后 - 第一个带有$estimates/*[1].

<xsl:template match="ns1:replyelement>
  <xsl:for-each-group select="ns1:ReplyDTO" group-by="ns1:estimateNo">
    <xsl:variable name="estimates">
      <xsl:perform-sort select="current-group()">
        <xsl:sort select="ns1:creationDate" order="descending" />
        <xsl:sort select="ns1:creationTime" order="descending" />
      </xsl:perform-sort> 
    </xsl:variable>
    <xsl:copy-of select="$estimates/*[1]" />  
  </xsl:for-each-group>
</xsl:template>

输出是:

<ns1:ReplyDTO>
    <ns1:creationDate>20160404</ns1:creationDate>
    <ns1:creationTime>194843</ns1:creationTime>
    <ns1:estimateNo>1234</ns1:estimateNo>
    <ns1:versionNo>006</ns1:versionNo>
</ns1:ReplyDTO>
<ns1:ReplyDTO>                       
    <ns1:creationDate>20160404</ns1:creationDate>
    <ns1:creationTime>094844</ns1:creationTime>
    <ns1:estimateNo>5678</ns1:estimateNo>        
    <ns1:versionNo>006</ns1:versionNo>
</ns1:ReplyDTO>

确保ns1在 XML 和 XSLT 中都定义了名称空间。


推荐阅读