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

如何优化XSLT的xsl:when多OR条件以适配多个Entry节点检查

问题:优化XSLT多Entry节点的条件检查逻辑

我有一段可正常运行的XSLT代码,用于检查输入负载中的第一个或第二个Entry节点是否满足对应条件。现在需要检查更多Entry节点(比如第3、4、5个等),但不想添加大量OR条件,该如何修改代码?

原代码如下:

<xsl:choose>
    <xsl:when test="(wd:Entry[1]/wd:Item = 'ABC' or wd:Entry[2]/wd:Item/@wd:Descriptor = 'ABC')">
        <wd:Type_Reference>
            <wd:ID wd:type="Type_ID">DEF</wd:ID>
        </wd:Type_Reference>
    </xsl:when>
</xsl:choose>
解决方案

根据你的需求,可以分两种场景优化代码:

场景1:多个Entry节点的检查条件一致

如果需要检查前N个Entry节点(比如前5个)中任意一个满足相同条件,可以用位置范围结合谓词简化,避免重复写OR:

<xsl:choose>
    <xsl:when test="wd:Entry[position() <= 5][wd:Item = 'ABC' or wd:Item/@wd:Descriptor = 'ABC']">
        <wd:Type_Reference>
            <wd:ID wd:type="Type_ID">DEF</wd:ID>
        </wd:Type_Reference>
    </xsl:when>
</xsl:choose>
  • position() <= 5 指定要检查的Entry节点范围(可根据需求调整数值)
  • 第二个方括号内是统一的检查条件,只要范围内有任意一个Entry符合条件,就会触发<xsl:when>块

场景2:不同位置的Entry节点有不同检查条件

如果不同位置的Entry需要满足不同条件(比如原代码中第1个检查wd:Item的值,第2个检查wd:Item的@wd:Descriptor属性),可以通过以下方式优化:

方式1:排版优化OR条件

如果条件无明显规律,可通过换行排版让代码更易读,避免一堆挤在一起的OR:

<xsl:choose>
    <xsl:when test="(wd:Entry[1]/wd:Item = 'ABC') 
                    or (wd:Entry[2]/wd:Item/@wd:Descriptor = 'ABC')
                    or (wd:Entry[3]/wd:Item = 'ABC')
                    or (wd:Entry[4]/wd:Item/@wd:Descriptor = 'ABC')
                    or (wd:Entry[5]/wd:Item = 'ABC')">
        <wd:Type_Reference>
            <wd:ID wd:type="Type_ID">DEF</wd:ID>
        </wd:Type_Reference>
    </xsl:when>
</xsl:choose>

方式2:利用位置规律简化

如果条件有规律(比如奇数位置检查wd:Item值,偶数位置检查@wd:Descriptor),可以用位置取余来统一处理:

<xsl:choose>
    <xsl:when test="wd:Entry[position() <= 5][
                        (position() mod 2 = 1 and wd:Item = 'ABC') 
                        or (position() mod 2 = 0 and wd:Item/@wd:Descriptor = 'ABC')
                    ]">
        <wd:Type_Reference>
            <wd:ID wd:type="Type_ID">DEF</wd:ID>
        </wd:Type_Reference>
    </xsl:when>
</xsl:choose>
  • position() mod 2 = 1 筛选奇数位置的Entry
  • position() mod 2 = 0 筛选偶数位置的Entry
  • 针对不同位置的Entry应用对应的检查条件,大幅减少重复代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:50:26