使用XSLT根据条件将XML节点属性动态传递给其他节点
我有一个很大的XML文件,其中有两个非常相似的节点。根据第一个节点的值,我需要删除第二个节点的非必需重复 XML示例:使用XSLT根据条件将XML节点属性动态传递给其他节点,xml,xslt,Xml,Xslt,我有一个很大的XML文件,其中有两个非常相似的节点。根据第一个节点的值,我需要删除第二个节点的非必需重复 XML示例: <ABC> <Project> <ProjectBaselines> <Baseline current="true" ID="01" /> <Baseline current="false" ID="02" /> <
<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:
使用XSLT的第一行,我可以删除当前值为false的所有
节点;但是,我找不到从
标记传递ID值的方法,其中current=true
使用键按ID属性查找基线元素
<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>
非常有魅力,非常感谢。在您的评论之后,请阅读更多关于xsl:key的内容,对于我目前的工作来说,它确实非常方便。
<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>