2010-07-04 31 views
1

我有一個XML需要按 類我嘗試使用XSLT換各組問題

<xsl:for-each-group select="ItemList/Item" group-by="CategoryID"> 

我怎樣才能獲得類別名稱,類別ID或改造過程中涉及到 類別的信息嗎?

原始XML

<ItemList> 
<Item> 
    <CategoryID>1</CategoryID> 
    <CategoryName>Book</CategoryName> 
    <ItemName>ASP.NET</ItemName> 
    <ItemDetails>ASP.NET12345</ItemDetails> 
</Item> 
<Item> 
    <CategoryID>1</CategoryID> 
    <CategoryName>Book</CategoryName> 
    <ItemName>PHP</ItemName> 
    <ItemDetails>PHP12345</ItemDetails> 
</Item> 
<Item> 
    <CategoryID>2</CategoryID> 
    <CategoryName>Tool</CategoryName> 
    <ItemName>ToolAbcde</ItemName> 
    <ItemDetails>sth details</ItemDetails> 
</Item></ItemList> 

新的XML

<NewXML> 
<Category> 
    <CategoryID>1</CategoryID> 
    <CategoryName>Book</CategoryName> 
    <ItemList> 
     <Item> 
      <ItemName>ASP.NET</ItemName> 
      <ItemDetails>ASP.NET12345</ItemDetails> 
     </Item> 
     <Item> 
      <ItemName>PHP</ItemName> 
      <ItemDetails>PHP12345</ItemDetails> 
     </Item> 
     <ItemName>PHP</ItemName> 
    </ItemList> 
</Category> 
<Category> 
    <CategoryID>2</CategoryID> 
    <CategoryName>Tool</CategoryName> 
    <ItemList> 
     <Item> 
      <ItemName>ToolAbcde</ItemName> 
      <ItemDetails>sth details</ItemDetails> 
     </Item> 
    </ItemList> 
</Category></NewXML> 

回答

7

XSLT規範對分組廣泛doucmentation,完全與http://www.w3.org/TR/xslt20/#xsl-for-each-group例子。您可能正在尋找current-group()current-grouping-key()函數。也

內順序構造,上下文項是相關組的初始項,上下文位置是這樣的項目的設置在初始項目的序列(每個組中的一個項目)中的位置組的處理順序,上下文大小是組數,當前組是正在處理的組,當前分組鍵是該組的分組鍵。

含義,這兩個表達式將相當於內部的xsl:for-各個羣組:CategoryIdcurrent-group()[1]/CategoryId。由於CategoryId是分組鍵,因此也與current-grouping-key()相同。以下是您的使用案例的完整示例:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output method="xml" indent="yes" encoding="utf-8" /> 

    <xsl:template match="/"> 
     <NewXml> 
      <xsl:for-each-group select="ItemList/Item" group-by="CategoryID"> 
       <Category> 
        <CategoryID><xsl:value-of select="CategoryID" /></CategoryID> 
        <CategoryName><xsl:value-of select="CategoryName" /></CategoryName> 
        <ItemList> 
         <xsl:for-each select="current-group()"> 
          <Item> 
           <ItemName><xsl:value-of select="ItemName" /></ItemName> 
           <ItemDetails><xsl:value-of select="ItemDetails" /></ItemDetails> 
          </Item> 
         </xsl:for-each> 
        </ItemList> 
       </Category> 
      </xsl:for-each-group> 
     </NewXml> 
    </xsl:template> 

</xsl:stylesheet> 
+0

+1得到非常詳細和準確的答案。 – 2010-07-04 15:19:59

+0

這是爲每個組元素相當新? C#XslCompiledTransform不允許我編譯 – 2013-08-07 12:31:17