2010-07-04 6 views
1

J'ai un xml besoin de groupe par catégorie j'essaie d'utiliserxslt pour-chaque groupe question

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

Comment puis-je obtenir le CategoryName, CategoryID ou toute information relative à la catégorie lors de la transformation?

XML d'origine

<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> 

Nouveau 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> 

Répondre

7

La spécification xslt dispose d'un vaste doucmentation sur le regroupement, avec des exemples à http://www.w3.org/TR/xslt20/#xsl-for-each-group. Vous recherchez probablement les fonctions current-group() et current-grouping-key(). Aussi

Dans le constructeur de séquence, l'élément de contexte est le point initial du groupe concerné, la position du cadre est la position de ce point entre la séquence d'éléments initiaux (un élément pour chaque groupe) disposé dans l'ordre de traitement des groupes, la taille du contexte est le nombre de groupes, le groupe actuel est le groupe en cours de traitement et la clé de regroupement actuelle est la clé de regroupement pour ce groupe.

Ce qui signifie que ces deux expressions seraient à l'intérieur xsl équivalent: for-each groupe: CategoryId et current-group()[1]/CategoryId. Puisque CategoryId est la clé de regroupement, elle est également identique à current-grouping-key(). Voici un exemple complet pour votre cas d'utilisation:

<?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 pour une réponse très détaillée et précise. –

+0

Est-ce que cet élément pour chaque groupe est plutôt nouveau? C# XslCompiledTransform ne me permet pas de compiler –