测试后代物品

时间:2009-12-11 16:17:32

标签: xslt sitecore

我正在尝试使用xslt在Sitecore网站中创建简单的商品库存。问题是我找不到一种方法来测试一个项目下面是否有后代项目。

很容易得到这样的顶级设置:

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

这将创建一个漂亮的平面主图像表,标题和每个项目的路径就在您开始的下方。问题是我找不到一种方法来轻松测试其中一个项目是否有后代。这将使代码看起来像这样:

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

3 个答案:

答案 0 :(得分:1)

没有必要测试后代。只需使用:

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

如果没有后代,则不会为该节点输出任何内容。

答案 1 :(得分:0)

Rashmi是正确的,如果没有孩子,for-each不应该执行。

但顺便说一句,只是为了回答这个问题,你可以进行测试

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

答案 2 :(得分:0)

如果要渲染列表并且不希望包装标记不是任何后代,则可能需要测试后代,那么您可能需要if:

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