XML排序需求:将updated与title值相同的entry置顶,修正错误XSLT
XML排序需求与XSLT修正方案
需求说明
需将XML中<entry>元素里updated字段与title字段值相同的条目排在输出XML最顶部,其余条目依次排在后面。
输入XML
<?xml version='1.0' encoding='UTF-8'?> <feed> <entry> <name>David</name> <updated>AA123</updated> <title>BB123</title> </entry> <entry> <name>John</name> <updated>AA123</updated> <title>AA123</title> </entry> <entry> <name>Jenny</name> <updated>CC789</updated> <title>TT789</title> </entry> <entry> <name>Dan</name> <updated>CC456</updated> <title>HH456</title> </entry> <entry> <name>Steve</name> <updated>CC456</updated> <title>CC456</title> </entry> <entry> <name>Jenny</name> <updated>AB456</updated> <title>DD789</title> </entry> </feed>
预期输出XML
<?xml version='1.0' encoding='UTF-8'?> <feed> <entry> <name>John</name> <updated>AA123</updated> <title>AA123</title> </entry> <entry> <name>Steve</name> <updated>CC456</updated> <title>CC456</title> </entry> <entry> <name>David</name> <updated>AA123</updated> <title>BB123</title> </entry> <entry> <name>Dan</name> <updated>CC456</updated> <title>HH456</title> </entry> <entry> <name>Jenny</name> <updated>AB456</updated> <title>DD789</title> </entry> <entry> <name>Jenny</name> <updated>CC789</updated> <title>TT789</title> </entry> </feed>
当前问题XSLT代码
原代码使用错误的分组逻辑,输出了不符合要求的<Customer>标签,且未实现按updated与title是否匹配的优先级排序:
<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:template match="/feed"> <Customer> <xsl:for-each-group select="entry" group-by="updated"> <xsl:for-each-group select="current-group()" group-by="title"> <xsl:copy-of select="current-group()"/> <xsl:apply-templates> <xsl:sort select="updated"/> <xsl:sort select="title"/> </xsl:apply-templates> </xsl:for-each-group> </xsl:for-each-group> </Customer> </xsl:template> </xsl:stylesheet>
修正后的XSLT代码
<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:template match="/feed"> <xsl:copy> <!-- 优先输出updated与title值相同的条目,按updated排序 --> <xsl:for-each select="entry[updated = title]"> <xsl:sort select="updated"/> <xsl:copy-of select="."/> </xsl:for-each> <!-- 输出剩余条目,按updated排序 --> <xsl:for-each select="entry[updated != title]"> <xsl:sort select="updated"/> <xsl:copy-of select="."/> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 保留原根节点
<feed>,避免输出错误的<Customer>标签。 - 分两段处理条目:
- 第一段筛选出
updated与title值相等的<entry>,按updated字段排序后复制输出,确保这类条目排在最顶部。 - 第二段处理剩余条目,同样按
updated排序后输出,匹配预期输出的顺序。
- 第一段筛选出
- 使用
xsl:copy-of直接复制原条目结构,保证输出内容与原输入的条目结构、内容完全一致。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

