2010-07-04 2 views
1

У меня есть XML нужно сгруппировать по категориям Я пытаюсь использоватьXSLT для-каждой группе вопросов

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

Как я могу получить CategoryName, CategoryID или любую информацию, относящуюся к категории во время трансформации?

Оригинальный 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: для-каждой группы: CategoryId и current-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 для очень подробного и точного ответа. –

+0

Является ли этот элемент для каждой группы довольно новым? C# XslCompiledTransform не позволяет компилировать –

Смежные вопросы