处理首个节点后对剩余XML Alignment节点进行倒序排序
解决方案:按指定规则排序HorizontalAlignment节点
问题分析
你需要实现两个核心逻辑:
- 第一个
HorizontalAlignment节点单独用reach模板处理,且内部元素按externalStation倒序排序; - 剩余
HorizontalAlignment节点整体按每个节点下第一个HorizontalElements对应的internalStat属性值倒序排序,节点内部的HorizontalElements保持原有顺序。
原代码的问题在于:直接遍历所有HorizontalAlignment节点,无法对"剩余节点"这个集合整体排序,必须先筛选出剩余节点,再对该集合应用排序规则。
修改后的XSLT代码
<!-- 单独处理第一个HorizontalAlignment节点 --> <xsl:apply-templates select="HorizontalAlignment[1]" mode="reach"> <xsl:sort select="descendant-or-self::*/HorizontalElements/Start/station/@externalStation" data-type="number" order="descending"/> </xsl:apply-templates> <!-- 处理剩余HorizontalAlignment节点,按首个HorizontalElements的internalStat倒序排序 --> <xsl:for-each select="HorizontalAlignment[position() > 1]"> <!-- 排序键:当前节点下第一个HorizontalElements对应的internalStat属性 --> <xsl:sort select="HorizontalElements[1]/Start/Reference/stat/@internalStat" data-type="number" order="descending"/> <!-- 对当前节点的HorizontalElements应用surfaceLine模板 --> <xsl:for-each select="HorizontalElements"> <xsl:apply-templates mode="surfaceLine"/> </xsl:for-each> </xsl:for-each>
关键说明
- 拆分处理逻辑:把第一个节点和剩余节点分开处理,避免在循环内用
xsl:choose限制排序范围; - 排序集合正确:对
HorizontalAlignment[position() > 1]这个节点集合应用xsl:sort,确保剩余节点整体按规则排序; - 路径匹配:请根据你的实际XML结构调整
xsl:sort中的路径(比如你提到的/Project/Alignment/Elements/Line/Start/Reference/stat/@internalStat,需对应到HorizontalAlignment节点下的实际层级)。
内容的提问来源于stack exchange,提问作者Chuck Rheault
相关产品推荐
相关产品推荐

