XSLT группирует дубликаты элементов узла и передает их как запрос - PullRequest
0 голосов
/ 04 мая 2018

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

Как получить оценочные числа здесь, используя 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>

1 Ответ

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

Следующий шаблон XSLT-2.0 копирует самый новый из ns1:estimateNo элементов. К сожалению, ваш пример не очень хороший, потому что все ns1:ReplyDTO имеют одинаковые ns1:creationDate. Так что, если дата совпадает, она выбирается на основе ns1:creationTime, с наибольшим числом первым. Это достигается с помощью двух xsl:sort в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...