如何使用 XSLT 1.0 过滤和获取 XML 中具有最新日期的元素

How to filter and fetch elements in XML which has latest date using XSLT 1.0

我有一个如下所示的 XML 负载,其中包含帐户列表。我想要 select 活跃账户,如果有任何账户处于活跃状态并且正在重复,那么我需要 select 基于该账户日期的最新账户。

输入负载:

<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 循环使用它我能够 select select 活动计划但不知道如何 select 基于最新帐户在有重复节点的日期。

提前致谢。

这需要大量的工作。您的数据提供者当然不会让事情变得更容易,他们选择向帐户元素名称添加序列号,并选择 DD-MM-YYYY 作为日期格式。

尝试:

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> 

要了解 Muenchian 分组,请阅读:http://www.jenitennison.com/xslt/grouping/muenchian.html