使用XSLT根据XML中的子属性值删除重复的父标签

时间:2019-07-02 08:34:51

标签: xml xslt

我有下面的XML文件,其中我需要基于子标签Exemption属性值删除ExemptionList标签,如果子标签属性值相同, 需要删除重复的父子标签。

输入XML:

 <MaterialInfo>
        <ExemptionList>
          <ExemptionListID authority="IPC" identity="EL2011/534/EU"/>
          <Exemption description="Lead in high melting temperature" identity="7(a)"/>
        </ExemptionList>
        <ExemptionList>
          <ExemptionListID authority="IPC" identity="EL2011/534/EU"/>
          <Exemption description="Lead in high melting temperature" identity="7(a)"/>
        </ExemptionList>
</MaterialInfo>

预期的输出XML:

<MaterialInfo>
        <ExemptionList>
          <ExemptionListID authority="IPC" identity="EL2011/534/EU"/>
          <Exemption description="Lead in high melting temperature" identity="7(a)"/>
        </ExemptionList>
</MaterialInfo>

基于XSLT v2.0转换所需的解决方案。

预先感谢

2 个答案:

答案 0 :(得分:0)

您想要类似的东西

<xsl:template match="MaterialInfo">
  <xsl:for-each-group select="*" group-by="@identity">
    <xsl:apply-templates select="current-group()[1]"/>
  </xsl:for-each-group>
<xsl:template>

这假设相等的@identity足以将两个元素标识为重复元素。

答案 1 :(得分:0)

您似乎想按ExemptionList子元素的identity属性值将Exemption元素分组:

  <xsl:template match="MaterialInfo">
      <xsl:copy>
          <xsl:for-each-group select="ExemptionList" group-by="Exemption/@identity">
              <xsl:apply-templates select="."/>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty-development.net/6r5Gh3Y有一个XSLT 3示例,但是对于XSLT 2处理器,您只需要替换身份转换模板在那里使用的xsl:mode声明

<xsl:template match="@* | node()">
   <xsl:copy>
     <xsl:apply-templates select="@* , node()"/>
   </xsl:copy>
</xsl:template>