如何在xsl中检查for-each是否为空?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在xsl中检查for-each是否为空?相关的知识,希望对你有一定的参考价值。
Further information:
<ul style="margin:0px; padding:0px 15px;">
<xsl:for-each select="footer/event_links/links">
<li style='color:#fff'> <a href="url" > <xsl:value-of select="text" disable-output-escaping="yes"/> </a> </li>
<img moz-do-not-send="true" src="$tpl_resource_urlimages/spacer.gif" width="100" height="10" alt=""/>
</xsl:for-each>
</ul>
我有上面的xsl代码块。我想确保它只在有任何元素存在的情况下才存在。footerevent_linkslinks 也就是说,如果for-each没有返回任何元素,那么我就不想显示文本的进一步信息。
我尝试了下面的方法,但似乎并不奏效。无论怎样,都会显示出文本的进一步信息。如何检查for-each是否为空?
<xsl:if test="footer/event_links/links != ''">
Further information:
<ul style="margin:0px; padding:0px 15px;">
<xsl:for-each select="footer/event_links/links">
<li style='color:#fff'> <a href="url" > <xsl:value-of select="text" disable-output-escaping="yes"/> </a> </li>
<img moz-do-not-send="true" src="$tpl_resource_urlimages/spacer.gif" width="100" height="10" alt=""/>
</xsl:for-each>
</ul>
</xsl>
你掉进了"!="的陷阱。在 XPath 中,表达式 A/B != ''
如果有一个被AB选中的节点的值不是'',则表达式为true。如果没有被AB选择的节点,则表达式为false。所以你要。
<xsl:if test="footer/event_links/links">
Further information:
<ul style="margin:0px; padding:0px 15px;">
<xsl:for-each select="footer/event_links/links">
在XSLT 3.0中,有一个特殊的构造,可以避免对同一个条件进行两次测试(这是个坏消息,因为它阻止了流媒体)。
<xsl:sequence>
<xsl:on-non-empty>Further information:</xsl:on-non-empty>
<xsl:conditional-content>
<ul style="margin:0px; padding:0px 15px;">
<xsl:for-each select="footer/event_links/links">
<li style='color:#fff'>
<a href="url" >
<xsl:value-of select="text"/>
</a>
</li>
<img moz-do-not-send="true" src="$tpl_resource_urlimages/spacer.gif" width="100" height="10" alt=""/>
</xsl:for-each>
</ul>
</xsl:conditional-content>
</xsl:sequence>
这里 xsl:on-non-empty
只有当它不是唯一由 xsl:sequence
和 xsl:conditional-content
丢弃空元素(即一个空的 <ul/>
)从其结果。
2020年更新
在最终的XSLT 3.0规范中, xsl:conditional-content
指令改名为 xsl:where-populated
.
<xsl:if test="footer/event_links/links">
<!-- ... -->
</xsl:if>
空节点集评价为false。换句话说,选择节点就足以测试它们是否存在,你不需要做显式比较。
以上是关于如何在xsl中检查for-each是否为空?的主要内容,如果未能解决你的问题,请参考以下文章
如何在已排序的 xsl:for-each 循环中访问前一个和下一个元素的值
XSL 风格:在 XSLT 中使用 <xsl:for-each select> 或 <xsl:template match> 或其他解决方案?