Сравните юлианскую дату в 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>
Другие вопросы по тегам