根据唯一值生成节点XSLT

时间:2020-01-16 13:34:16

标签: xslt

输入以下内容

<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>

现在想获得以下输出

<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a9</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <type>3</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a9</vaue>
    </list>
    <type>3</type>
</item>

对于每个类型为1的项目,如果列表中包含名称“ a”,则希望创建一个新项目。但是想避免重复。 通过两步过程就可以实现此输出。首先创建具有重复项的项目,然后进行单独的键匹配以删除重复项。

有没有一种方法可以一步实现,而不是创建重复项然后过滤重复项

1 个答案:

答案 0 :(得分:1)

这只是一个分组问题。此样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:key name="item-by-vaue" match="item[type=1]" use="list[name='a']/vaue"/>

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

  <xsl:template match="root">
      <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
      <xsl:for-each 
        select="item[type=1]
                    [count(.|key('item-by-vaue',list[name='a']/vaue)[1])=1]">
        <item>
          <xsl:apply-templates select="list[name='a']"/>
          <type>3</type>
        </item>
      </xsl:for-each>
      </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

使用您的输入样本输出:

<root>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>1</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>2</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>1</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>2</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <type>3</type>
   </item>
</root>

请注意:,您输入的示例与您指定的规则不匹配您的预期输出:没有vaue字符串值为'a9'的元素。< / p>