需要将XML与文件夹名称分组,然后分段

时间:2016-03-28 16:27:11

标签: xslt xslt-2.0

            <custom> 
            <section name="A">
            <element name="Folder">A11</element>
            <element name="Name">Test1</element>
            <element name="Result">Fail</element>                
            </section>
            <section name="B">
            <element name="Folder">A11</element>
            <element name="Name">Test2</element>
            <element name="Result">Pass</element>               
            </section>
            <section name="C">
            <element name="Folder">A12</element>
            <element name="Name">Test3</element>
            <element name="Result">Pass</element>                
            </section>
            <section name="D">
            <element name="Folder">A13</element>
            <element name="Name">Test4</element>
            <element name="Result">Pass</element>                
            </section>
            </custom>
            <custom>             
            <section name="A">
            <element name="Folder">A12</element>
            <element name="Name">Test1</element>
            <element name="Result">Pass</element>                
            </section>
            <section name="B">
            <element name="Folder">A12</element>
            <element name="Name">Test2</element>
            <element name="Result">Fail</element>                
            </section>
            <section name="C">
            <element name="Folder">A11</element>
            <element name="Name">Test3</element>
            <element name="Result">Pass</element>      
            </section>
            <section name="D">
            <element name="Folder">A13</element>
            <element name="Name">Test4</element>
            <element name="Result">Pass</element>                
            </section>
            </custom>

按文件夹分组 文件夹下的部分名称 所有元素名称

E.g。

A11 - 部分名称=“A” - 文件夹,名称,结果值

  • section name =“B”
  • 文件夹,名称,结果值

A12 - 部分名称=“C” - 文件夹,名称,结果值

A13 - 部分名称=“D” - 文件夹,名称,结果值

- 每个Custom ---

也是如此

需要以下格式的结果:

            <root>
            <custom>
            <Folder>A11
            <section name>A
            <element name="Folder">A11</element>
            <element name="Name">Test1</element>
            <element name="Result">Fail</element> 
            </section>
            <section name="B">
            <element name="Folder">A11</element>
            <element name="Name">Test2</element>
            <element name="Result">Pass</element>
            </section>
            </Folder>
            <Folder>A12
            <section name>C
            <element name="Folder">A12</element>
            <element name="Name">Test3</element>
            <element name="Result">Pass</element> 
            </section> 
            </Folder>
            <Folder>A13
            <section name="D">
            <element name="Folder">A13</element>
            <element name="Name">Test4</element>
            <element name="Result">Pass</element>    
            </section> 
            </Folder>
            <custom>
            <custom>
            <Folder>A11
            <section name>C
            <element name="Folder">A11</element>
            <element name="Name">Test3</element>
            <element name="Result">Pass</element> 
            </section> 
            </Folder>
            <Folder>A12
            <section name>A
            <element name="Folder">A12</element>
            <element name="Name">Test1</element>
            <element name="Result">Pass</element>
            </section> 
            <section name>B
            <element name="Folder">A12</element>
            <element name="Name">Test2</element>
            <element name="Result">Fail</element> 
            </section> 
            </Folder>
            <Folder>A13
            <section name="D">
            element name="Folder">A13</element>
            <element name="Name">Test4</element>
            <element name="Result">Pass</element>  
            </section> 
            </Folder>
            <custom>
            </root>

1 个答案:

答案 0 :(得分:0)

首先应该从XSLT Identity Template开始,复制输入文档中的所有节点

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

但是,您可以添加模板以匹配custom元素,然后可以使用该元素对section元素进行分组。在XSLT 2.0中,你可以使用xsl:for-each-group来实现这个

<xsl:for-each-group select="section" group-by="element[@name='Folder']">

在此内容中,创建新的folder元素并将现有的section元素复制到此元素中相对简单。

  <folder name="{current-grouping-key()}">
    <xsl:apply-templates select="current-group()" />
  </folder>

试试这个XSLT。请注意,这不会为您提供您在问题中显示的XML,因为您显示的XML格式不正确(<section name>无效),但它应该为您提供一般性的想法。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

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

  <xsl:template match="custom">
    <xsl:for-each-group select="section" group-by="element[@name='Folder']">
      <folder name="{current-grouping-key()}">
        <xsl:apply-templates select="current-group()" />
      </folder>
    </xsl:for-each-group>
  </xsl:template>

  <xsl:template match="element[@name='Folder']" />
</xsl:stylesheet>