如何使用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
相关产品推荐
相关产品推荐

