Дублирующиеся узлы в XML - PullRequest
       42

Дублирующиеся узлы в XML

0 голосов
/ 08 февраля 2012

Я хочу применить таблицу стилей XSL, которая удаляет повторяющиеся узлы в моем xml. Я тестирую какое-то решение, но не могу этого сделать :( моя программа в Visual C # Studio.

У меня есть следующий XML:

<store>

 <laptop>
  <ID>1</ID>
  <price>X2</price>
 </laptop>

 <laptop>
  <ID>2</ID>
  <price>X1</price>
 </laptop>

 <laptop>
  <ID>8</ID>
  <price>X2</price>
 </laptop>

 <laptop>
  <ID>2</ID>
  <price>X3</price>
 </laptop>

</store>

Желаемый вывод:

    <store>

     <laptop>
      <ID>1</ID>
      <price>X2</price>
     </laptop>

     <laptop>
      <ID>8</ID>
      <price>X2</price>
     </laptop>

     <laptop>
      <ID>2</ID>
      <price>X3</price>
     </laptop>

    </store>

1 Ответ

1 голос
/ 08 февраля 2012

Решение ниже делает то, что вы просите, и работает следующим образом:

  1. Первый шаблон начинается с корня и выбирает все теги ID, которые делают не имеет тега ID ниже с тем же значением (вот почему ID 2 приходит в конец вывода)
  2. Перебрать список узлов ID и вывести родительский элемент () и все это дети

Комментарии приветствуются, это моя первая попытка в XSL за последние два года. Я попробовал xsl: copy, но он не включал имена детских тегов, но обнаружились значения, не мог понять почему!?

Извлечено из его содержимого:

  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>

Рабочий код:

 <xsl:stylesheet 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
        exclude-result-prefixes="xs">

    <xsl:template match="/">
     <store>
     <xsl:variable name="non-duplicates"
     select="//ID[not(.=following::ID)]" />   

     <xsl:for-each select="$non-duplicates">
       <xsl:copy-of select="parent::*"/>
     </xsl:for-each>
     </store>
    </xsl:template>
</xsl:stylesheet>
...