У меня есть пример сообщения, в котором мне нужно удалить дубликат в блоке temperatureInformation и temperatureStats.Удаление дубликатов в родительском и дочернем объекте в XSLT
Сообщение образца
<document>
<body>
<party>
<gtin>1000909090</gtin>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909090</gtin>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE1</attr>
</row>
<row>
<attr name="StatsCode">CODE2</attr>
</row>
</attrGroupMany>
</row>
<row>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE1</attr>
</row>
<row>
<attr name="StatsCode">CODE3</attr>
</row>
</attrGroupMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE5</attr>
</row>
<row>
<attr name="StatsCode">CODE6</attr>
</row>
</attrGroupMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE7</attr>
</row>
<row>
<attr name="StatsCode">CODE8</attr>
</row>
</attrGroupMany>
</row>
</attrGroupMany>
</pos>
</party>
</body>
</document>
Я использую ниже XSLT, в котором дубликат родителя, который temperatureInformation удаляется, но продублировать в дочерних temperatureStats не удаляется
Ожидаемый выход составляет
<document>
<body>
<party>
<gtin>1000909090</gtin>
<pos>
<attrGroupMany name="temperatureInformation">
<row>
<gtin>1000909090</gtin>
<attr name="temperatureCode">STORAGE</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
<value qual="CC">20</value>
</attrQualMany>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE1</attr>
</row>
<row>
<attr name="StatsCode">CODE2</attr>
</row>
<row>
<attr name="StatsCode">CODE3</attr>
</row>
</attrGroupMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrQualMany name="temperature">
<value qual="FAH">10</value>
</attrQualMany>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE5</attr>
</row>
<row>
<attr name="StatsCode">CODE6</attr>
</row>
</attrGroupMany>
</row>
<row>
<attr name="temperatureCode">HANDLING</attr>
<attrGroupMany name="temperatureStats">
<row>
<attr name="StatsCode">CODE7</attr>
</row>
<row>
<attr name="StatsCode">CODE8</attr>
</row>
</attrGroupMany>
</row>
</attrGroupMany>
</pos>
</party>
</body>
</document>
XSLT используется
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:key name="grouptemperatureInformation" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row"
use="concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/>
<xsl:key name="grouptemperatureStats" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row/attrGroupMany[@name = 'temperatureStats']/row"
use="concat(generate-id(ancestor::pos), '|', attr[@name = 'StatsCode'])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attrGroupMany[@name = 'temperatureInformation']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="row[generate-id() = generate-id(key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attrGroupMany[@name = 'temperatureStats']">
<xsl:copy>
<xsl:apply-templates select="@* | key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|',../attr[@name = 'temperatureCode'], '|', ../attrQualMany[@name = 'temperature']))/attrGroupMany[@name = 'temperatureStats']/row"/>
<!-- <xsl:apply-templates select="@*"/>
<xsl:apply-templates select="row[generate-id() = generate-id(key('grouptemperatureStats', concat(generate-id(ancestor::pos), '|', attr[@name = 'StatsCode']))[1])]"/> -->
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Может ли кто-нибудь вести меня туда, где я ошибаюсь.
Я старался анализировать ввод/вывод/XSLT, но не мог понять многое. Можете ли вы попытаться объяснить свою проблему более наглядным образом. –
Конкатентное значение температурыКод и температура повторяются для строк 1 и 2. Он удаляется из XSLT, который я упомянул, но corressponding StatsCode, который является дублирующим (имеющий значение CODE1 в двух местах), не удаляется. Я снова обновил XSLT в вопросе. – Victor
Я чувствую, что способ, используемый для удаления, не является надежным. Если ваши элементы 'attrQualMany [@name = 'temperature']/value' не находятся в том же порядке, что и предыдущие, или один из них отсутствует, они не будут считаться дублирующими. –