我正在尝试使用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>
答案 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) > 0">
<ul>
<xsl:for-each select="./item">
<li>
<!-- content here -->
</li>
</xsl:for-each>
</ul>
</xsl:if>