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

如何使用XSLT根据Baseline节点属性过滤Task中的Bline节点

解决XML中基于Baseline ID过滤Bline节点的问题

我来帮你搞定这个需求!你已经成功移除了非当前版本的Baseline节点,现在只需要把那个current="true"的Baseline的ID提取出来,就能精准过滤Tasks里的Bline节点了。

思路说明

我们可以先通过变量存储目标Baseline的ID值,然后在处理Bline节点时,用这个变量来判断是否保留该节点。具体步骤如下:

  • 定义变量获取current="true"的Baseline节点的ID属性值
  • 使用XSLT的身份模板(Identity Template)保留XML的原有结构和其他节点
  • 保留你已经写好的移除非当前Baseline的模板
  • 添加过滤Bline节点的模板,只保留ID与变量匹配的节点

完整XSLT代码

<xsl:stylesheet version="1.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>

    <!-- 定义变量:获取current="true"的Baseline的ID -->
    <xsl:variable name="current-baseline-id" select="//Baseline[@current='true']/@ID"/>

    <!-- 移除current不为true的Baseline节点 -->
    <xsl:template match="Baseline[@current != 'true']"/>

    <!-- 移除ID与当前Baseline不匹配的Bline节点 -->
    <xsl:template match="Bline[@ID != $current-baseline-id]"/>
</xsl:stylesheet>

效果演示

输入XML:

<ABC>
    <Project>
        <ProjectBaselines>
            <Baseline current="true" ID="01" />
            <Baseline current="false" ID="02" />
            <Baseline current="false" ID="03" />
        </ProjectBaselines>
    </Project>
    <Tasks>
        <Task>
            <Bline ID="01" />
            <Bline ID="02" />
            <Bline ID="03" />
            <Bline ID="04" />
        </Task>
    </Tasks>
</ABC>

转换后输出XML:

<ABC>
    <Project>
        <ProjectBaselines>
            <Baseline current="true" ID="01"/>
        </ProjectBaselines>
    </Project>
    <Tasks>
        <Task>
            <Bline ID="01"/>
        </Task>
    </Tasks>
</ABC>

这样就完美实现了你的需求:既保留了当前版本的Baseline,又只保留了与之ID匹配的Bline节点,移除了所有重复的非必要项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:15