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

XSLT同级双标签排序问题:按Type与NonRecurringCharges排序失效如何解决

问题原因

  • 你当前的XSLT是对单个Offerings节点内部的子元素进行排序,而你的需求是对ContractSummary下的所有Offerings节点整体按规则排序,逻辑完全不匹配,所以执行后没有预期变化。
  • 第二排序维度默认按是否存在NonRecurringCharges处理,缺失该标签的节点排在有该标签的节点前面,符合输出示例要求。

修正后完整XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份复制模板:所有节点默认原样复制 -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 匹配ContractSummary节点,对其下的Offerings节点排序 -->
    <xsl:template match="ContractSummary">
        <xsl:copy>
            <!-- 先复制除Offerings外的其他子节点,比如OrderInfo -->
            <xsl:apply-templates select="@* | *[not(self::Offerings)]"/>
            <!-- 对所有Offerings节点按规则排序 -->
            <xsl:apply-templates select="Offerings">
                <!-- 第一排序规则:按Type文本升序,OneTimeService会排在Product前面 -->
                <xsl:sort select="Type" order="ascending" data-type="text"/>
                <!-- 第二排序规则:按是否存在NonRecurringCharges排序,不存在的排在前面 -->
                <xsl:sort select="count(NonRecurringCharges)" order="ascending" data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出说明

执行上述XSLT后,得到的结果和你预期的结构一致:

  1. 第一个Offerings是Type为OneTimeService的节点
  2. 第二个是Type为Product且没有NonRecurringCharges的节点
  3. 第三个是Type为Product且带有NonRecurringCharges的节点
    注:你示例输出里的Product2为笔误,原XML不存在该Type值,排序后带NonRecurringCharges的Product节点Type值会保持原样,不会自动变更为Product2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:09:05