2010-07-26 7 views
1

Ceci est un exemple de mon fichier d'entrée.Il est possible de définir une priorité sur une clause "group-starting-with"?

<root> 
    <!-- [...] --> 
    <bbb>Foo 1</bbb> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <bbb>Foo 2</bbb> 
    <ccc>Foo 2.1</ccc> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <bbb>Foo 3</bbb> 
    <ccc>Foo 3.1</ccc> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <ccc>Foo 4</ccc> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
    <aaa>xxxxxxxx</aaa> 
</root> 

Je veux regrouper les noeuds par les éléments bbb et ccc. Il est également possible qu'il n'y ait que bbb ou seulement ccc dans l'entrée-xml.

Il y a des conditions suivantes:

  • condition A: groupe par "bbb" ou "ccc" élément
  • condition B: si un "ccc" suit immédiatement un "bbb" les prendre ensemble

C'est le outpout-xml je veux avoir:

<root> 
     <group> 
      <header>Foo 1</header> 
       <groupcontent> 
        <aaa>xxxxxxxx</aaa> 
        <aaa>xxxxxxxx</aaa> 
        <aaa>xxxxxxxx</aaa> 
       </groupcontent> 
     </group> 
     <group> 
      <header>Foo 2</header> 
      <subheader>Foo 2.1</subheader> 
      <groupcontent> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
      </groupcontent> 
     </group> 
     <group> 
      <header>Foo 3</header> 
      <subheader>Foo 3.1</subheader> 
      <groupcontent> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
      </groupcontent> 
     </group> 
     <group> 
      <subheader>Foo 4</subheader> 
      <groupcontent> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
       <aaa>xxxxxxxx</aaa> 
      </groupcontent> 
     </group> 
    </root> 

Actuellement i ha en Je suis XSL. Mais le problème est qu'il génère foreach "Foo" un "groupe" -Element.

<xsl:stylesheet> 

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

    <xsl:template match="/"> 
    <output> 
      <xsl:for-each-group select="root/*" group-starting-with="bbb|ccc"> 
       <group> 
         <xsl:apply-templates select="current-group()[self::bbb or self::ccc]"></xsl:apply-templates> 
         <groupcontent> 
          <xsl:apply-templates select="current-group()[not(self::bbb) and not (self::ccc)]"></xsl:apply-templates> 
         </groupcontent> 
       </group> 
      </xsl:for-each-group> 
     </output> 
    </xsl:template> 

    <xsl:template match="bbb"> 
     <header><xsl:value-of select="."></xsl:value-of></header> 
    </xsl:template> 

    <xsl:template match="ccc"> 
     <subheader><xsl:value-of select="."></xsl:value-of></subheader> 
    </xsl:template> 

    <xsl:template match="aaa"> 
     <p><xsl:value-of select="."></xsl:value-of></p> 
    </xsl:template> 

</xsl:stylesheet> 

Comment puis-je ajouter la condition B à mon XSL. Est-il même possible de résoudre cela avec un groupe foreach? Est-ce que je peux ajouter la condition B au "groupe commençant-avec" et lui donner une priorité plus élevée que la condition A? J'ai lu quelque chose que vous pouvez donner des modèles une priorité ...

thx à l'avance cpt.oneeye

Répondre

2

Préserver votre style de feuille de style, cette feuille de style:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
<output> 
    <xsl:for-each-group select="root/*" group-starting-with= 
    "bbb|ccc[preceding-sibling::*[1][not(self::bbb)]]"> 
    <group> 
     <xsl:apply-templates select= 
     "current-group()[self::bbb or self::ccc]"/> 
     <groupcontent> 
     <xsl:apply-templates select= 
      "current-group()[not(self::bbb) and not (self::ccc)]"/> 
     </groupcontent> 
    </group> 
    </xsl:for-each-group> 
</output> 
</xsl:template> 
<xsl:template match="bbb"> 
<header> 
    <xsl:value-of select="."/> 
</header> 
</xsl:template> 
<xsl:template match="ccc"> 
<subheader> 
    <xsl:value-of select="."/> 
</subheader> 
</xsl:template> 
<xsl:template match="aaa"> 
<p> 
    <xsl:value-of select="."/> 
</p> 
</xsl:template> 

sortie :

<output> 
    <group> 
     <header>Foo 1</header> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
    <group> 
     <header>Foo 2</header> 
     <subheader>Foo 2.1</subheader> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
    <group> 
     <header>Foo 3</header> 
     <subheader>Foo 3.1</subheader> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
    <group> 
     <subheader>Foo 4</subheader> 
     <groupcontent> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
      <p>xxxxxxxx</p> 
     </groupcontent> 
    </group> 
</output> 
+1

Grande solution (+1). Cependant le formatage était si mauvais que j'ai édité votre réponse. S'il vous plait, n'écrivez jamais: '

+0

salut alejandro, merci (encore) pour la solution. cela a bien fonctionné –

+0

@Dimitre: Merci pour l'édition.J'ai seulement changé le modèle pour le groupement.Je devrais payer l'attention à ces instructions vides. –