Следующий шаблон 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.