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

XSLT排序printDoc节点问题:处理无type属性的printDoc时无法按预期排序

XSLT排序printDoc节点问题:处理无type属性的printDoc时无法按预期排序

看起来你遇到的问题是那些不带type属性的printDoc节点没被正确归类,导致排序不符合预期对吧?

先帮你分析下现有代码的问题:你当前用printDoc[@type!='adhoc']来筛选要先输出的非adhoc节点,但在XPath规则里,不存在的属性和任何值做比较都会返回false,所以那些没有type属性的printDoc根本不会被这个条件匹配到。结果就是这些节点既不会被第一个<xsl:apply-templates>处理,也不会被第二个针对@type='adhoc'的模板处理,自然就打乱了你想要的排序逻辑。

要解决这个问题很简单,只需要把第一个筛选条件改成printDoc[not(@type='adhoc')]就行。这个条件的意思是:所有type属性不等于adhoc,或者根本没有type属性的printDoc节点。这样就能把所有非adhoc的节点(包括无type的)按原有顺序先输出,最后再输出所有type='adhoc'的节点,完全符合你的需求。

修改后的完整XSLT代码如下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="printJob">
        <xsl:copy>
            <!-- 先处理所有非adhoc的printDoc(包括无type属性的) -->
            <xsl:apply-templates select="printDoc[not(@type='adhoc')]" />
            <!-- 最后处理所有adhoc类型的printDoc -->
            <xsl:apply-templates select="printDoc[@type='adhoc']" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

举个例子验证下:假设你的原始XML是这样的:

<printJob>
    <printDoc>无type属性</printDoc>
    <printDoc type="normal">普通类型</printDoc>
    <printDoc type="adhoc">临时类型</printDoc>
    <printDoc type="other">其他类型</printDoc>
</printJob>

转换后的结果会是:

<printJob>
    <printDoc>无type属性</printDoc>
    <printDoc type="normal">普通类型</printDoc>
    <printDoc type="other">其他类型</printDoc>
    <printDoc type="adhoc">临时类型</printDoc>
</printJob>

完全符合你“非adhoc节点保持原顺序,adhoc节点放最后”的要求。

备注:内容来源于stack exchange,提问作者Chetan Mehra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:05:35