如何在xsl中检查空for-each?

时间:2015-04-22 03:48:04

标签: xml xslt

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>

2 个答案:

答案 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。换句话说,选择节点足以测试它们的存在,您不需要进行明确的比较。