XML中的重复节点

时间:2012-02-08 08:27:57

标签: 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>
 </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 个答案:

答案 0 :(得分:1)

以下解决方案可以满足您的要求并按以下方式运行:

  1. 第一个模板从root开始,选择所有ID标签 没有下面带有相同值的ID标签(这就是ID 2出现的原因 输出结束)
  2. 循环显示ID节点列表并输出父节点() 以及所有这些孩子
  3. 欢迎提出意见,这是我在过去两年中第一次尝试使用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>