Я следующий документ XML:Сравните и удалить дубликаты из XML с помощью XSLT
<root>
<Organization>
<Organization_ID >111111</Organization_ID>
<Organization_Code>ABC</Organization_Code>
</Organization>
<Organization>
<Organization_ID >111111</Organization_ID>
<Organization_Code>ABC</Organization_Code>
</Organization>
<Organization>
<Organization_ID >111111</Organization_ID>
<Organization_Code>ABCD</Organization_Code>
<Organization_Type>Test</Organization_Type>
</Organization>
</root>
мне нужен выход, как (удаление дубликатов записей):
<root>
<Organization>
<Organization_ID>111111</Organization_ID>
<Organization_Code>ABC</Organization_Code>
</Organization>
<Organization>
<Organization_ID>111111</Organization_ID>
<Organization_Code>ABCD</Organization_Code>
<Organization_Type>Test</Organization_Type>
</Organization>
</root>
Я уже написал код, ниже которого может это сделать. Мои проблемы заключаются в том, что нам нужно сравнить все дочерние элементы, как увидеть, являются ли они точными дубликатами. Как только я поставил условие Organization_Type, выход выбирает все три записи
Мой код:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Organization">
<xsl:if
test="
(not(following::Organization[Organization_ID = current()/Organization_ID])
or not(following::Organization[Organization_Code = current()/Organization_Code])
)">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
код, который я хочу использовать, но не работает:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Organization">
<xsl:if
test="
(not(following::Organization[Organization_ID = current()/Organization_ID])
or not(following::Organization[Organization_Code = current()/Organization_Code])
or not(following::Organization[Organization_Type = current()/Organization_Type])
)">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Любая помощь будет быть оцененным. Извините, это мой первый пост, поэтому возможно, вы не разместите его в правильном месте или в правильном формате.
У меня вопрос: Вы хотите, чтобы отфильтровать точные дубликаты (все дочерние узлы должны быть одинаковыми для организации, чтобы отфильтровать) или частичные дубликаты (один дочерний узел должен быть идентичны для организации, которая будет отфильтрована)? –
Да, я отфильтровываю точные дубликаты. Решение, приведенное ниже, работало для меня. Благодаря! – Sunny