XML中的重复节点

XML中的重复节点,xml,xsd,xml-parsing,Xml,Xsd,Xml Parsing,我想应用一个XSL样式表来删除xml中的重复节点。 我测试了一些解决方案,但我做不到:(我的程序在Visual C#Studio中 我有以下XML: <store> <laptop> <ID>1</ID> <price>X2</price> </laptop> <laptop> <ID>2</ID> <price>X1</price&

我想应用一个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>

1.
X2
2.
X1
8.
X2
2.
X3
所需输出为:

    <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.
X2
8.
X2
2.
X3

以下解决方案满足您的要求,并按以下方式工作:

  • 第一个模板从根开始,并选择所有执行此操作的ID标记 下面没有具有相同值的ID标记(这就是为什么ID 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>