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后,得到的结果和你预期的结构一致:
- 第一个Offerings是Type为
OneTimeService的节点 - 第二个是Type为
Product且没有NonRecurringCharges的节点 - 第三个是Type为
Product且带有NonRecurringCharges的节点
注:你示例输出里的Product2为笔误,原XML不存在该Type值,排序后带NonRecurringCharges的Product节点Type值会保持原样,不会自动变更为Product2。
内容的提问来源于stack exchange,提问作者Idur Jul
相关产品推荐
相关产品推荐

