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_url}images/spacer.gif" width="100" height="10" alt=""/>
</xsl:for-each>
</ul>
我有上面的xsl代码块。我想确保它只存在 footer / event_links / links 中的任何元素。也就是说,如果for-each没有返回任何元素,那么我不想显示文本的进一步信息。< / p>
我试过以下;但是,它似乎没有用。无论如何,文本进一步显示信息。如何检查空的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_url}images/spacer.gif" width="100" height="10" alt=""/>
</xsl:for-each>
</ul>
</xsl>
答案 0 :(得分:2)
你陷入了“!=”陷阱。在XPath中,如果A / B选择的节点的值不是'',则表达式A/B != ''
为真。如果A / B没有选择节点,则表达式为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_url}images/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/>
会丢弃{{1}}的空元素(即空{{1}})结果
答案 1 :(得分:1)
<xsl:if test="footer/event_links/links">
<!-- ... -->
</xsl:if>
空节点集的计算结果为false。换句话说,选择节点足以测试它们的存在,您不需要进行明确的比较。