2009-12-11 6 views
0

J'essaie de créer un simple inventaire d'éléments dans un site Web Sitecore en utilisant un xslt. Le problème est que je ne peux pas trouver un moyen de tester si un élément a des éléments descendants en dessous.Test pour les objets descendants

Il est facile d'obtenir le plus haut niveau fixé comme celui-ci:

<xsl:template match="*" mode="main"> 
<table width="100%" class="alternating"> 
    <xsl:for-each select="./item"> 
     <tr> 
<td width="100px"><sc:image field="Image" mh="100" mw="100" /></td> 
<td style="vertical-align:top"><h2><sc:text field="Title"/></h2></td> 
<td style="vertical-align:top"><xsl:value-of select="sc:path(.)" /></td> 
     </tr> 
    </xsl:for-each> 
</table> 
</xsl:template> 

Cela crée une belle table plate de l'image principale, le titre et le chemin de chaque élément juste au-dessous où vous commencez. Le problème est que je ne peux pas trouver un moyen de tester facilement si l'un de ces éléments a des descendants. Cela ressemblerait à ceci:

<xsl:template match="*" mode="main"> 
<table width="100%" class="alternating"> 
    <xsl:for-each select="./item"> 
     <tr> 
<td width="100px"><sc:image field="Image" mh="100" mw="100" /></td> 
<td style="vertical-align:top"><h2><sc:text field="Title"/></h2></td> 
<td style="vertical-align:top"><xsl:value-of select="sc:path(.)" /></td> 
<td> 
    <!—test whether the item has descendants --> 
    <xsl:if test=?????> 
     <!—loop through descendant items --> 
     <xsl:for-each select="./item"> 
     Render information about each descendant item 
     </xsl:for-each> 
    </xsl:if> 
</td> 
     </tr> 
    </xsl:for-each> 
</table> 
</xsl:template> 

Répondre

1

Il n'est pas nécessaire de tester les descendants. Il suffit d'utiliser:

... 
<td>   
<!-- loop through descendant items if any -->   
<xsl:for-each select="./item">   
<!-- Render information about each descendant item -->  
</xsl:for-each>  
</xsl:if> 
</td> 
... 

S'il n'y a pas de descendants, rien ne sera généré pour ce noeud.

0

Rashmi est correct, le for-each ne devrait pas s'exécuter s'il n'y a pas d'enfants.

Mais soit dit en passant, juste pour répondre à la question, vous pouvez effectuer un test

<xsl:if test="count(item) != 0"> 
0

Vous pouvez tester pour les descendants si vous êtes rendu une liste et ne veulent pas les étiquettes d'emballage lorsque ce Aren » t les descendants alors vous pouvez vouloir le si:

<xsl:if test="count(./item) &gt; 0"> 
    <ul> 
    <xsl:for-each select="./item"> 
     <li> 
     <!-- content here --> 
     </li> 
    </xsl:for-each> 
    </ul> 
</xsl:if> 
Questions connexes