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

Спасибо, Ятан.


person Yatan    schedule 18.10.2016    source источник
comment
Ваш вывод, кажется, идентичен вводу. Судя по вашему описанию, это вопрос на группировку. Выполните поиск - это, вероятно, наиболее часто задаваемый вопрос XSLT здесь. Обратите внимание, что ответы для XSLT 1.0 и 2.0 различны.   -  person michael.hor257k    schedule 18.10.2016
comment
Привет, Майкл, в выходном XML последние 2 заказа имеют одинаковый номер заказа, поэтому столбец даты изменился на более высокую дату.   -  person Yatan    schedule 18.10.2016
comment
Я понимаю. Ваш процессор поддерживает XSLT 2.0?   -  person michael.hor257k    schedule 18.10.2016
comment
да Михаил..........................   -  person Yatan    schedule 18.10.2016


Ответы (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>
person michael.hor257k    schedule 18.10.2016
comment
Хороший. Кстати, какая дата 116286? Это не Джулиан. - person michael.hor257k; 18.10.2016
comment
просто так я поставил какой-то номер. - person Yatan; 18.10.2016