2013-11-03 72 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>