2013-11-03 43 views
1

我有一个输入XML分组在XML使用XSLT 2.0

<document> 
     <row> 
     <column1>book1</column1>  
     <column2>00290</column2>  
     <column3>asddfr</column3> 
    </row> 
    <row> 
     <column1>book1</column1> 
     <column2>00290</column2>  
     <column3>cdcd</column3> 
    </row> 
    </document> 

我想要的输出XML作为,在遍历整个XML我需要分组和子分组为它们中的每

<book name="Book1"> 
    <title name="asddfr" code="00290"> 
     <title name="cdcd" code="00290"> 
</book> 
+1

你尝试过这么远吗?看看这个[SO帖子](http://stackoverflow.com/questions/2146648/how-to-apply-group-by-on-xslt-elements/2334224#2334224)。 – pasty

+0

我正在尝试使用XSLT 2.0并将使用servingXml来转换,cince我不知道xslt我遇到了麻烦 – user2949419

+0

如果您正在查找的XSLT应该创建XML输出,那么请发布格式良好的XML结果样本。目前你有'title'开始标签,它们从不关闭,所以你不清楚你想要的结果。 –

回答

0

这个问题太老了,不能期待答案。但是,对于其他可能偶然发现XSLT 2.0分组的人来说,下面是XSLT,它将帮助解释。

要求按book1进行分组,即XSLT 2.0提供<xsl:for-each-group>功能的<column1>节点中的值。

<xsl:for-each-group select="row" group-by="column1" > 

一旦分组完成后,节点<book>可以与属性@name存储在current-grouping-key()具有值来创建。属性值模板,即花括号用于替换返回的值。

<book name="{current-grouping-key()}"> 

下一步的current-group()内循环得到了<title>节点@name@code

<xsl:for-each select="current-group()"> 

完整的XSLT看起来如下

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

    <xsl:template match="document"> 
     <xsl:for-each-group select="row" group-by="column1" > 
      <book name="{current-grouping-key()}"> 
       <xsl:for-each select="current-group()"> 
        <title name="{column3}" code="{column2}" /> 
       </xsl:for-each> 
      </book> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

,输出是

<book name="book1"> 
    <title name="asddfr" code="00290"/> 
    <title name="cdcd" code="00290"/> 
</book>