Исключить последнее вхождение повторяющихся узлов. Дубликаты узлов - это узлы с несколькими атрибутами с одинаковыми значениями - PullRequest
1 голос
/ 29 декабря 2010

Я пытался написать XPath / XSLT для моей проблемы обнаружения и устранения дублирующих узлов.В моем случае дублирующиеся узлы - это узлы с несколькими атрибутами с одинаковыми значениями.Я хочу устранить дубликат, исключив последнее вхождение дублирующего узла.Пожалуйста, сообщите, если есть какой-либо другой метод.

Pls Примечание: дублирующие узлы = узлы с одинаковыми значениями атрибутов operator1, operator2 и operator3.

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="5" operator1='xxx' operator2='lkj' operator3='tyu'/>
  <record id="6" operator1='xxx' operator2='yyy' operator3='zzz'/>
  <record id="7" operator1='abc' operator2='yyy' operator3='zzz'/>
  <record id="8" operator1='abc' operator2='yyy' operator3='zzz'/>
  <record id="9" operator1='xxx' operator2='yyy' operator3='zzz'/>
  <record id="10" operator1='rrr' 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'/>
  <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>

Я ближе всего пришел с этим Xpath, но он не работает точно.

"//record[(./@operator1 = following-sibling::record/@operator1) and (./@operator2 = following-sibling::record/@operator2) and (./@operator3 = following-sibling::record/@operator3)]".

Я искал весь интернет, но безуспешно,Любая помощь действительно очень ценится.Большое спасибо.

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Я пытался написать 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>
0 голосов
/ 29 декабря 2010

Вот пример таблицы стилей XSLT 1.0, в которой исключены последние дубликаты элементов записи:

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:key name="k1" 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[generate-id() 
                              = 
                              generate-id(key('k1', 
                                              concat(@operator1, '|', 
                                                     @operator2, '|', 
                                                     @operator3))[last()])]"/>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...