2009-06-16 9 views
0

J'ai un ensemble de nœuds Sitecore:XSL au groupe article

<item> 
    <item> 
    <item />  
    </item> 
    <item /> <!-- (1) --> 
    <item /> 
</item> 
<item> 
    <item /> 
    <item /> 
</item> 

je peux obtenir le chemin de ces utilisant une fonction sc: (.) ​​Chemin, qui retourne quelque chose comme «/article/article » pour le point marqué (1).

Ce que je veux être en mesure de faire est de regrouper l'élément en fonction de leur chemin.

Donc ma sortie serait quelque chose comme:

<ul> 
    <li>in item 
    <ul> 
... 
    </ul> 
    </li> 
    <li>in item/item 
    <ul> 
... 
    </ul> 
    </li> 
</ul> 

Je joue avec les axes précédents en ce moment, comme dans le code suivant:

<xsl:for-each select="exsl:node-set($processedResult)/item"> 
    <xsl:sort 
    select="substring-before(substring-after(sc:path(.),'/sitecore/media library/'),'.aspx')" 
    data-type="text" 
    order="ascending" /> 
    <xsl:variable 
    name="path" 
    select="search:GetFriendlyPath('/sitecore/media library/',sc:path(.))" /> 
    <!-- returns: item/item from /sitecore/media library/item/item/item.aspx -->      
    <xsl:variable name="lastPath"> 
    <xsl:choose> 
     <xsl:when test="sc:path(preceding)"> 
     <xsl:value-of 
      select="search:GetFriendlyPath('sitecore/media library',sc:path(preceding))" /> 
     </xsl:when> 
     <xsl:otherwise>none</xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable>    
    <xsl:if test="$path != $lastPath"> <!-- grouping test --> 
    <li> 
     <strong>in <xsl:value-of select="$path" /></strong> 
    </li> 
    </xsl:if> 
    <li> 
    <!-- render detail --> 
    </li> 
</xsl:for-each> 

... mais sc: chemin (précédent) ne renvoie rien. D'où mon chèque ne fonctionne pas.

Qu'est-ce que je fais mal?

+0

où vient processedResult $ de? Avez-vous accès aux s sous la forme d'un document ou sont-ils renvoyés en tant que RTF par une sorte de fonction? – Tomalak

+0

Désolé, $ processedResult est la structure . C'est le résultat d'une opération d'ensemble de nœuds. Cela produit le XML prévu. –

Répondre

1

Je ne suis pas sûr de ce que vous avez l'intention de le faire avec

<xsl:when test="sc:path(preceding)"> 

Ce lit comme « nourrir les enfants nommés <preceding> comme un ensemble de nœuds à la fonction sc:path() ».

En regardant votre entrée, il n'y a aucun élément enfant portant ce nom.

Serait-ce que vous voulez dire quelque chose comme

<xsl:when test="sc:path(preceding-sibling::item[1])"> 

?

Ne connaissant rien Sitecore, je vais donner un coup de feu avec:

<xsl:for-each select="exsl:node-set($processedResult)/item"> 
    <xsl:sort select=" 
    substring-before(
     substring-after(sc:path(.), '/sitecore/media library/'), 
     '.aspx' 
    )" 
    data-type="text" 
    order="ascending" 
    /> 
    <xsl:variable name="path" select=" 
    search:GetFriendlyPath(
     '/sitecore/media library/', sc:path(.) 
    ) 
    " /> 
    <xsl:variable name="lastPath"> 
    <xsl:choose> 
     <xsl:when test="preceding-sibling::item[1]"> 
     <xsl:value-of select=" 
      search:GetFriendlyPath(
      'sitecore/media library', sc:path(preceding-sibling::item[1]) 
     )" 
     /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:text>none</xsl:text> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 

    <!-- grouping test --> 
    <xsl:if test="$path != $lastPath"> 
    <li> 
     <strong> 
     <xsl:text>in </xsl:text> 
     <xsl:value-of select="$path" /> 
     </strong> 
    </li> 
    </xsl:if> 

    <li> 
    <!-- render detail --> 
    </li> 
</xsl:for-each> 
+0

Cependant, je ne suis pas sûr que l'approche que vous prenez (si précédent! = Courant) va réussir en termes de regroupement significatif et de sortie. – Tomalak

+0

Ça y est. Excellent, merci beaucoup. –

+0

Bon à entendre. :) – Tomalak