Я пытался написать
XPath / XSLT для моей проблемы обнаружения
и устранение дублирующих узлов. В моем
случай, дубликаты узлов являются узлами с
несколько атрибутов с одинаковыми значениями.
Как я хочу устранить дубликаты
исключая последнее вхождение
дубликат узла. Пожалуйста, совет, если
есть любой другой метод.
Pls Примечание: дублирующиеся узлы = узлы с
одинаковые значения operator1, operator2
и атрибуты operator3.
Это противоречивое определение удаления дубликатов узлов .
Вы не удаляете дублирующиеся узлы, просто удаляя последний из последовательности дубликатов. Ваш желаемый результат:
<data id = "root">
<record id="1" operator1='xxx' operator2='yyy' operator3='zzz'/>
<record id="2" operator1='abc' operator2='yyy' operator3='zzz'/>
<record id="3" operator1='abc' operator2='yyy' operator3='zzz'/>
<record id="4" operator1='xxx' operator2='yyy' operator3='zzz'/>
<record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
<record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
</data>
по-прежнему содержит дубликаты, такие как record
s с id (1, 4 и 6) и (2, 3 и 7)
Правильное удаление дубликатов, также называемое дедупликация , требует оставить только один элемент из всех дублирующих элементов . Это традиционно выполняется в XSLT 1.0 с помощью метода Мюнхена для группировки:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kRecByAtts" match="record"
use="concat(@operator1,'***',
@operator2,'***',
@operator3)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"record
[not(generate-id()
=
generate-id(key('kRecByAtts',
concat(@operator1,'***',
@operator2,'***',
@operator3)
)[1]
)
)
]
"/>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<data id = "root">
<record id="1" operator1='xxx' operator2='yyy' operator3='zzz'/>
<record id="2" operator1='abc' operator2='yyy' operator3='zzz'/>
<record id="3" operator1='abc' operator2='yyy' operator3='zzz'/>
<record id="4" operator1='xxx' operator2='yyy' operator3='zzz'/>
<record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
<record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
</data>
желаемый, правильный результат выдается :
<data id="root">
<record id="1" operator1="xxx" operator2="yyy" operator3="zzz"/>
<record id="2" operator1="abc" operator2="yyy" operator3="zzz"/>
</data>