使用 XSLT 删除 XML 文件的子节点中的重复值

Remove duplicate values in child nodes of XML file using XSLT

我有以下 xml 数据,我想从此 xml.

中删除重复值
<Report_Data>
    <Report_Entry>
        <Classifications_group>
            <ClassificationGroupName Descriptor="EEO-1 Job Categories">
            </ClassificationGroupName>
            <ClassificationDescription>Professionals</ClassificationDescription>
        </Classifications_group>
        <Classifications_group>
            <ClassificationGroupName Descriptor="Hartford Job Category">
            </ClassificationGroupName>
            <ClassificationDescription>Other</ClassificationDescription>
        </Classifications_group>
        <Classifications_group>
            <ClassificationGroupName Descriptor="Hartford Job Category">
            </ClassificationGroupName>
            <ClassificationDescription>Other</ClassificationDescription>
        </Classifications_group>
    </Report_Entry>
    <Report_Entry>
        <Classifications_group>
            <ClassificationGroupName Descriptor="EEO-1 Job Categories">
            </ClassificationGroupName>
            <ClassificationDescription>Administrative Support Workers</ClassificationDescription>
        </Classifications_group>
        <Classifications_group>
            <ClassificationGroupName Descriptor="Hartford Job Category">
            </ClassificationGroupName>
            <ClassificationDescription>Other</ClassificationDescription>
        </Classifications_group>
    </Report_Entry>
</Report_Data>

我已使用以下 XSLT 删除重复值。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
     exclude-result-prefixes="xs" version="2.0">
   
    <xsl:variable name="CRLF" select="'&#xA;'"/>
    <xsl:output indent="no" method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="Report_Data">
        <xsl:value-of select="'ClassificationGroupName,ClassificationDescription'"/>
        <xsl:value-of select="$CRLF"/>
        <xsl:for-each select="Report_Entry">
            
            <xsl:for-each-group select="Classifications_group" group-by="concat(ClassificationGroupName/@Descriptor, '|', ClassificationDescription)">

                <xsl:value-of select="ClassificationGroupName/@Descriptor"/> 
                <xsl:value-of select="','"/>
                <xsl:value-of select="ClassificationDescription"/>
                <xsl:value-of select="$CRLF"/>

            </xsl:for-each-group> 
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出:

ClassificationGroupName,ClassificationDescription
EEO-1 Job Categories,Professionals
Hartford Job Category,Other
EEO-1 Job Categories,Administrative Support Workers
Hartford Job Category,Other

异常输出:

ClassificationGroupName,ClassificationDescription
EEO-1 Job Categories,Professionals
Hartford Job Category,Other
EEO-1 Job Categories,Administrative Support Workers

使用我编写的代码,它仅删除 Report_Entry 中的重复项。我想删除是否在任何其他 Report_Entry 中也有任何其他具有 Classifications_group 的 ClassificationGroupName 和 ClassificationDescription 的重复值。

我需要做哪些更改才能获得预期的输出?

我认为您想对所有条目进行分组,例如在具有复合键的 XSLT 3 中

  <xsl:template match="Report_Data">
    <xsl:for-each-group select="Report_Entry/Classifications_group" composite="yes" group-by="ClassificationGroupName/@Descriptor, ClassificationDescription">
      <xsl:value-of select="current-grouping-key()" separator=", "/>
      <xsl:text>&#10;</xsl:text>
    </xsl:for-each-group>
  </xsl:template>

或者,通过您的 XSLT 2 方法,使用

<xsl:template match="Report_Data">
    <xsl:value-of select="'ClassificationGroupName,ClassificationDescription'"/>
    <xsl:value-of select="$CRLF"/>

        <xsl:for-each-group select="Report_Entry/Classifications_group" group-by="concat(ClassificationGroupName/@Descriptor, '|', ClassificationDescription)">

            <xsl:value-of select="ClassificationGroupName/@Descriptor"/> 
            <xsl:value-of select="','"/>
            <xsl:value-of select="ClassificationDescription"/>
            <xsl:value-of select="$CRLF"/>

        </xsl:for-each-group> 
</xsl:template>