У узла XSLT есть группа дублирующих элементов - PullRequest
0 голосов
/ 06 мая 2018

Я получаю несколько узлов RetrieveReplyDTO и дублирую оценку. Нет полей. Требование заключается в том, что мы должны выяснить, получаем ли мы какие-либо повторяющиеся оценки No под узлами RetrieveReplyDTO, и если мы получаем какие-либо повторяющиеся оценки No, затем проверьте creationDate и creationTime этого конкретного узла "RetrieveReplyDTO" и получим последний номер оценки.

Пример XML:

<?xml version="1.0" encoding="UTF-8" ?><ns0:retrieveResponse xmlns:ns0="some.url">
     <ns0:out>
        <ns0:replyElements>               
           <ns0:RetrieveReplyDTO>
              <ns0:estimateNo>1234</ns0:estimateNo>
              <ns0:estimateStatus>IN</ns0:estimateStatus>
              <ns0:creationDate>20170220</ns0:creationDate>
              <ns0:creationTime>111536</ns0:creationTime>
           </ns0:RetrieveReplyDTO>
           <ns0:RetrieveReplyDTO>
              <ns0:estimateNo>1234</ns0:estimateNo>
              <ns0:estimateStatus>IN</ns0:estimateStatus>
              <ns0:creationDate>20170225</ns0:creationDate>
              <ns0:creationTime>144500</ns0:creationTime>
           </ns0:RetrieveReplyDTO>  
           <ns0:RetrieveReplyDTO>
              <ns0:estimateNo>4567</ns0:estimateNo>
              <ns0:estimateStatus>IN</ns0:estimateStatus>
              <ns0:creationDate>20170230</ns0:creationDate>
              <ns0:creationTime>144500</ns0:creationTime>
           </ns0:RetrieveReplyDTO>
           <ns0:RetrieveReplyDTO>
              <ns0:estimateNo>4567</ns0:estimateNo>
              <ns0:estimateStatus>IN</ns0:estimateStatus>
              <ns0:creationDate>20170229</ns0:creationDate>
              <ns0:creationTime>100045</ns0:creationTime>
           </ns0:RetrieveReplyDTO>                            
        </ns0:replyElements>
     </ns0:out>
  </ns0:retrieveResponse>

ниже XSLT я пробовал

<xsl:template match="/replyElements">  <xsl:for-each-group select="ns0:RetrieveReplyDTO" group-by="ns0:estimateNo">   
  <xsl:perform-sort select="current-group()">
    <xsl:sort select="ns0:creationDate" order="descending" />
    <xsl:sort select="ns0:creationTime" order="descending" />
  </xsl:perform-sort> 
</xsl:variable>
<xsl:copy-of select="." /></xsl:for-each-group></xsl:template>

Я получаю результат ниже:

<?xml version = '1.0' encoding = 'UTF-8'?><ns0:retrieveResponse ><ns0:out>
  <ns0:replyElements>
     <ns0:RetrieveReplyDTO>
              <ns0:estimateNo>1234</ns0:estimateNo>
              <ns0:estimateStatus>IN</ns0:estimateStatus>
              <ns0:versionNo>001</ns0:versionNo>
           <ns0:creationDate>20170225</ns0:creationDate>
              <ns0:creationTime>144500</ns0:creationTime>
           </ns0:RetrieveReplyDTO>
     <ns0:RetrieveReplyDTO>
              <ns0:estimateNo>4567</ns0:estimateNo>
              <ns0:estimateStatus>IN</ns0:estimateStatus>
              <ns0:creationDate>20170229</ns0:creationDate>
              <ns0:creationTime>100045</ns0:creationTime>
           </ns0:RetrieveReplyDTO>
  </ns0:replyElements>

Он дает второй поисковый запрос без оценки, не выполняет никаких действий. пожалуйста помогите

1 Ответ

0 голосов
/ 06 мая 2018

Внутри for-each-group вы можете использовать for-each с xsl:sort s, а затем вы можете вывести первый элемент в порядке сортировки, то есть изменить

<xsl:template match="/replyElements">  <xsl:for-each-group select="ns0:RetrieveReplyDTO" group-by="ns0:estimateNo">   
  <xsl:perform-sort select="current-group()">
    <xsl:sort select="ns0:creationDate" order="descending" />
    <xsl:sort select="ns0:creationTime" order="descending" />
  </xsl:perform-sort> 
</xsl:variable>
<xsl:copy-of select="." /></xsl:for-each-group></xsl:template>

до

<xsl:template match="replyElements">  
<xsl:for-each-group select="ns0:RetrieveReplyDTO" group-by="ns0:estimateNo">   
  <xsl:for-each select="current-group()">
    <xsl:sort select="ns0:creationDate" order="descending" />
    <xsl:sort select="ns0:creationTime" order="descending" />
    <xsl:if test="position() = 1">
      <xsl:copy-of select="."/>
  </xsl:for-each> 
</xsl:for-each-group>
</xsl:template>

Обратите внимание, что я также изменил шаблон match, так как replyElements не является корневым элементом во входном фрагменте.

...