如何在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:sequencexsl: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是否为空?的主要内容,如果未能解决你的问题,请参考以下文章

在 XSLT 中检查字符串是不是为空或空

我可以在 xsl for-each 中使用“和”运算符吗?

如何在已排序的 xsl:for-each 循环中访问前一个和下一个元素的值

XSL 风格:在 XSLT 中使用 <xsl:for-each select> 或 <xsl:template match> 或其他解决方案?

从xsl查找变量的节点:xsl:for-each中的变量

如何在 XSLT 中打破 for-each 以及如何更新 XSLT 中的现有变量