使用XSLT根据条件将XML节点属性动态传递给其他节点

使用XSLT根据条件将XML节点属性动态传递给其他节点,xml,xslt,Xml,Xslt,我有一个很大的XML文件,其中有两个非常相似的节点。根据第一个节点的值,我需要删除第二个节点的非必需重复 XML示例: <ABC> <Project> <ProjectBaselines> <Baseline current="true" ID="01" /> <Baseline current="false" ID="02" /> <

我有一个很大的XML文件,其中有两个非常相似的节点。根据第一个节点的值,我需要删除第二个节点的非必需重复

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:



使用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>