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

使用XSLT 2.0按属性和文本内容匹配移除XML节点的问题

修正你的XSLT 2.0节点过滤逻辑

看起来你是把两个独立的条件组合错了——你大概率写成了「移除所有A2开头id的节点 或者 所有ill为yes的节点」,而不是需求里要求的「移除同时满足A2开头+ill=yes,或者同时满足G5开头+ill=probable的节点」。

错误逻辑的常见场景

比如如果你的代码是类似这样的:

<xsl:template match="teacher[@id[starts-with(.,'A2')] or ill/text()='yes']"/>
<xsl:template match="teacher[@id[starts-with(.,'G5')] or ill/text()='probable']"/>

这种写法会把只满足单一条件的节点也误删,完全不符合你的需求。

修正后的XSLT代码

正确的做法是把每个移除规则的两个条件用and绑定,再用or连接两组完整规则:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.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>

    <!-- 精准匹配需要移除的teacher节点 -->
    <xsl:template match="teacher[
        (@id[starts-with(., 'A2')] and ill = 'yes') 
        or 
        (@id[starts-with(., 'G5')] and ill = 'probable')
    ]"/>
</xsl:stylesheet>

代码逻辑说明

  1. 保留默认的复制模板,确保所有不符合移除条件的节点、属性和文本都被原样输出。
  2. 针对teacher节点的匹配模板里,用括号明确分组两个组合条件:
    • 第一组:@id以"A2"开头 并且 ill元素的文本是"yes"
    • 第二组:@id以"G5"开头 并且 ill元素的文本是"probable"
  3. 只有完全满足其中任意一组条件的teacher节点才会被移除(因为该模板没有输出任何内容)。

这样就能精准过滤掉你指定的两类节点,不会再误删只满足单一条件的节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:10:40