使用XSLT将基于条件的XML节点属性动态传递到其他节点

时间:2018-05-29 07:12:13

标签: xml xslt

我有一个大的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值的方法。

1 个答案:

答案 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>