我有下面的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转换所需的解决方案。
预先感谢
答案 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>