2010-07-04 102 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