Как фильтровать и извлекать элементы в XML, который имеет самую последнюю дату, используя XSLT 1.0 - PullRequest
0 голосов
/ 05 октября 2019

У меня есть полезная нагрузка XML, как показано ниже, которая содержит список учетных записей. Я хочу выбрать активные учетные записи, и если какая-либо учетная запись активна и повторяется, то мне нужно выбрать последнюю учетную запись на основе даты этой учетной записи.

Входная полезная нагрузка:

<accounts>
    <account1>
        <name>abc</name>
        <account_no>123</account_no>
        <status>Active</status>
        <date>20-05-2018</date>
    </account1>
    <account2>
        <name>def</name>
        <account_no>123</account_no>
        <status>Active</status>
        <date>20-06-2018</date>
    </account2>
    <account3>
        <name>ghi</name>
        <account_no>1234</account_no>
        <status>Active</status>
        <date>20-05-2018</date>
    </account3>
    <account4>
        <name>jkl</name>
        <account_no>1234</account_no>
        <status>In Active</status>
        <date>20-05-2018</date>
    </account4>
</accounts>

Ожидаемый результат:

<accounts>
    <account2>
        <name>def</name>
        <account_no>123</account_no>
        <status>Active</status>
        <date>20-06-2018</date>
    </account2>
    <account3>
        <name>ghi</name>
        <account_no>1234</account_no>
        <status>Active</status>
        <date>20-05-2018</date>
    </account3>
</accounts>

Пожалуйста, помогите мне с этим, я попытался использовать цикл for-each, используя который я мог выбирать активные планы, но не понимал, как выбрать последнюю учетную запись на основе даты, когда естьповторяет узлы.

Заранее спасибо.

1 Ответ

1 голос
/ 05 октября 2019

Это требует значительного объема работы. И ваш провайдер данных, конечно же, не упрощает задачу, добавив серийный номер к именам элементов учетной записи, а также выбрав в качестве формата даты ДД-ММ-ГГГГ.

Попробуйте:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name='acc' match="*[starts-with(name(), 'account') and status='Active']" use="account_no"/>

<xsl:template match="/accounts">
    <xsl:copy>
        <!-- GROUP ACTIVE ACCOUNTS BY account_no, USING MUENCHIAN GROUPING -->
        <xsl:for-each select="*[starts-with(name(), 'account') and status='Active'][count(. | key('acc', account_no)[1]) = 1]">
            <!-- SORT CURRENT GROUP BY DATE, DESCENDING -->
            <xsl:for-each select="key('acc', account_no)">
                <!-- SORT BY YEAR -->
                <xsl:sort select="substring(date, 7, 4)" data-type="number" order="descending"/>
                <!-- SORT BY MONTH -->
                <xsl:sort select="substring(date, 4, 2)" data-type="number" order="descending"/>
                <!-- SORT BY DAY -->
                <xsl:sort select="substring(date, 1, 2)" data-type="number" order="descending"/>
                <!-- RETURN THE FIRST RECORD IN THE SORTED GROUP -->
                <xsl:if test="position()=1">
                    <xsl:copy-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet> 

Чтобы понять мюнхенскую группировку, прочитайте: http://www.jenitennison.com/xslt/grouping/muenchian.html

...