我有一个大的XML文件,其中有2个节点非常相似。根据第一个节点的值,我需要删除第二个节点的非必需重复。
示例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>
XSLT:
<xsl:template match="Baseline[@current !='true']"/>
<xsl:template match="Bline[@ID != *ID of the Baseline node where current=true*]" />
使用XSLT的第一行,我能够删除当前为<Baseline>
的所有false
个节点;但是我找不到从<Baseline>
标记current=true
传递ID值的方法。
答案 0 :(得分:1)
使用密钥按ID属性
查找Baseline元素<xsl:key name="Baselines" match="Baseline" use="@ID" />
然后你的模板匹配忽略等效基线为真的Bline元素,是这个....
<xsl:template match="Bline[key('Baselines', @ID)/@current = 'true']" />
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:key name="Baselines" match="Baseline" use="@ID" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Baseline[@current !='true']"/>
<xsl:template match="Bline[key('Baselines', @ID)/@current = 'true']" />
</xsl:stylesheet>