2012-02-08 10 views
0

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

У меня есть следующий 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. Первая шаблонная звезда ts в корневой папке и выбирает все теги 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>