2010-02-01 12 views
1

J'essaie d'ajouter une hiérarchie à un XML de composition extrudé extravagant. Je n'arrive pas à gérer le regroupement de plusieurs types de groupes dans le même élément parent à la fois.Regroupement de plusieurs groupes dans XSLT 2

Ce que j'ai (simplifié, évidemment):

<article> 
    <h1>A section title here</h1> 
    <p>A paragraph.</p> 
    <p>Another paragraph.</p> 
    <bl>Bulleted list item.</bl> 
    <bl>Another bulleted list item.</bl> 
    <h1>Another section title</h1> 
    <p>Yet another paragraph.</p> 
</article> 

Ce que je veux:

<article> 
    <sec> 
    <h1>A section title here</h1> 
    <p>A paragraph.</p> 
    <p>Another paragraph.</p> 
    <list> 
     <list-item>Bulleted list item.</list-item> 
     <list-item>Another bulleted list item.</list-item> 
    </list> 
    </sec> 
    <sec> 
    <h1>Another section title</h1> 
    <p>Yet another paragraph.</p> 
    </sec> 
</article> 

Cela fonctionne presque pour les éléments de la liste:

<xsl:for-each-group select="*" group-adjacent="boolean(self::BL)"> 
    <xsl:choose> 
     <xsl:when test="current-grouping-key()"> 
     <list><xsl:apply-templates select="current-group()"/></list> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:apply-templates select="current-group()"/> 
      </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each-group> 

mais il ne poignées la toute première liste dans un article; et dès que j'essaye d'ajouter un autre xsl: for-each-group pour couvrir les sections, le premier item de la liste cesse de fonctionner.

Des idées? Merci d'avance!

Répondre

2

Voici une feuille de style de l'échantillon qui produit la sortie que vous avez affichée pour l'échantillon d'entrée que vous avez posté:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

    <xsl:template match="article"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-starting-with="h1"> 
     <sec> 
      <xsl:copy-of select="."/> 
      <xsl:for-each-group select="current-group() except ." group-adjacent="boolean(self::bl)"> 
      <xsl:choose> 
       <xsl:when test="current-grouping-key()"> 
       <list> 
        <xsl:apply-templates select="current-group()"/> 
       </list> 
       </xsl:when> 
       <xsl:otherwise> 
       <xsl:copy-of select="current-group()"/> 
       </xsl:otherwise> 
      </xsl:choose> 
      </xsl:for-each-group> 
     </sec> 
     </xsl:for-each-group> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="bl"> 
    <list-item> 
     <xsl:apply-templates/> 
    </list-item> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Wow, c'est incroyablement, grotesquement horrible ... Je ne peux imaginer que les girations si je devais ajouter numbered listes! Est-ce que les créateurs de XSLT 2 ont utilisé cette fonctionnalité dans des cas d'utilisation concrets? Votre solution fonctionne, cependant; Merci pour l'aide. –