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

XSLT筛选指定属性值元素时为何返回全部元素?

问题原因

出现这个问题是两个写法错误共同造成的:

  • 你没拦截XSLT的内置默认模板逻辑。XSLT默认从文档根节点开始逐层往下遍历所有节点,只要你没给某个节点写对应的自定义处理模板,它就会走内置规则:自动递归遍历所有子节点,把文本内容都输出。你现在只写了匹配带attrib="select"的staff的模板,根节点、company节点、id=1002那个不带目标属性的staff都没写对应处理规则,这些节点走默认逻辑就会被遍历输出,不该出现的staff自然就跑出来了。
  • 模板匹配的层级和内部选择路径完全不对。你现在写的模板是匹配单个符合条件的staff元素,但你的预期是最外层生成一个parent节点,里面包header和过滤后的company内容,匹配的节点层级完全错了。就算匹配到了单个staff,你在模板里写<xsl:copy-of select="staff"/>也是找当前staff节点下面的子staff,根本选不到你要的内容。
修复方案

直接用下面的XSLT代码即可得到你要的输出:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <!-- 从文档根节点开始控制整体输出结构,避免默认模板乱遍历 -->
    <xsl:template match="/">
        <parent>
            <header>Some inserted text</header>
            <xsl:apply-templates select="company"/>
        </parent>
    </xsl:template>

    <!-- 处理company节点,只保留符合属性条件的staff -->
    <xsl:template match="company">
        <xsl:copy>
            <!-- 筛选时直接加属性判断,不符合的staff直接跳过不复制 -->
            <xsl:copy-of select="staff[@attrib = 'select']"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

这个写法从根节点开始就完全控制了输出逻辑,不会触发默认模板的意外输出,筛选staff的时候直接在XPath里加属性判断,不带attrib="select"的staff根本不会被选中,输出结果和你预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:57:20