如何使用 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
我有一个如下所示的 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