You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

代码说明

  1. 保留原根节点<feed>,避免输出错误的<Customer>标签。
  2. 分两段处理条目:
    • 第一段筛选出updated与title值相等的<entry>,按updated字段排序后复制输出,确保这类条目排在最顶部。
    • 第二段处理剩余条目,同样按updated排序后输出,匹配预期输出的顺序。
  3. 使用xsl:copy-of直接复制原条目结构,保证输出内容与原输入的条目结构、内容完全一致。

内容的提问来源于stack exchange,提问作者Nikita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:20:28