使用 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="'
'"/>
<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> </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>
我有以下 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="'
'"/>
<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> </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>