2016-03-28 59 views
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> 

分组的XML文件夹下的所有 名称Elment需要组按文件夹 部分名称与文件夹名称,然后在部分

例如

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

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

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

A13 - 段名= “d” - 文件夹,名称,结果值

--Same去为每个个人---

需要导致以下格式:

  <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> 
+0

欢迎来到SO。你需要显示你已经尝试过,这不是一个“给我代码”网站。 – kebs

+0

您显示的“XML”格式不正确:<1/2/3/image1.jpeg>不正确的XML语法。在使用XSLT处理任何东西之前,它需要是格式良好的XML。 –

+0

可以显示除XML(或HTML)以外的输出吗?谢谢 –

回答

0

你首先应该开始与所有节点复制从输入文档

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

XSLT Identity 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> 
+0

谢谢。 我收到以下错误: XslTransformException --------------------- 'for-each-group'不是公认的扩展元素。 – user6125167

+0

您已将此标签标记为XSLT 2.0,但是您实际上是否使用了支持XSLT 2.0的处理器?你实际使用什么处理器来完成转换? –

+0

如何获取处理器细节? XSL标头: \t \t \t \t的 user6125167

相关问题