Сравните юлианскую дату в XSLT и замените на более высокую
У меня есть сложное требование в XSLT
Входной XML ниже
<Orders>
<Order>
<OrderNumber>100</OrderNumber>
<Date>116256</Date>
</Order>
<Order>
<OrderNumber>101</OrderNumber>
<Date>116257</Date>
</Order>
<Order>
<OrderNumber>102</OrderNumber>
<Date>116286</Date>
</Order>
<Order>
<OrderNumber>102</OrderNumber>
<Date>116276</Date>
</Order>
</Orders>
Мое требование состоит в том, чтобы проверить на тот же номер заказа, если они одинаковы, то взять дату, которая выше, в моем случае это в юлианском формате, поэтому я должен просто взять тот, который является большим числом.
Выходной XML должен выглядеть так, как показано ниже.
<Orders>
<Order>
<OrderNumber>100</OrderNumber>
<Date>116256</Date>
</Order>
<Order>
<OrderNumber>101</OrderNumber>
<Date>116257</Date>
</Order>
<Order>
<OrderNumber>102</OrderNumber>
<Date>116286</Date>
</Order>
<Order>
<OrderNumber>102</OrderNumber>
<Date>116286</Date>
</Order>
</Orders>
Спасибо Ятан
1 ответ
Решение
Вот один из способов посмотреть на это:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="order-by-number" match="Order" use="OrderNumber" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Date">
<xsl:copy>
<xsl:value-of select="max(key('order-by-number', ../OrderNumber)/Date)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>