如何防止生成<ol> </ol>

时间:2014-03-28 13:21:16

标签: xslt

我如何能够正确地阻止&lt; ol&gt;如果组为空,则生成: 我有这个(丑陋的)代码:

  ......
  </a>
  <xsl:if test="not(empty(current-group() except current-group()[1]))">
  <ol>
    <xsl:for-each select="current-group() except current-group()[1]">
      <li>
        ....
      </li>
    </xsl:for-each>
   </ol>
   </xsl:if>
   ....                                         

3 个答案:

答案 0 :(得分:1)

您可以使用xsl:choose

<xsl:choose>
    <xsl:when test="">
         <!-- with <ol> -->
    </xsl:when>
    <xsl:otherwise>
         <!-- without <ol> -->
    </xsl:otherwise>
</xsl:choose>

答案 1 :(得分:1)

您可以将test简化为

<xsl:if test="current-group()[2]">

因为这对于单身人士组来说是一个空序列(视为假)。

或者声明一个变量以避免代码重复:

<xsl:variable name="listItems" select="current-group()[position() gt 1]"/>
<xsl:if test="$listItems">
  <ol>
    <xsl:for-each select="$listItems">
      ...

答案 2 :(得分:1)

很少有语言能够满足您正在考虑三个条件的简单事实。

If there are things put something at the start
For each thing do an action
If there are things put something at the end

唯一具有近似值的语言是Django及其for ... empty语法,但即便如此也不一样。

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

如果您希望在有项目的情况下出现该列表,那么您的例子就是最好的逻辑,这是Ian Roberts提出的建议。

要做你要求的事情需要:

<xsl:wierd-for-each select="current-group() except current-group()[1]">
  <xsl:wrapper-element name="ol" />
  <xsl:looped-things>
    <li>
      ....
    </li>
  <xsl:looped-things>
</xsl:for-each>

执行looped-things,然后在执行循环时将其插入到create元素中。更加务实的方法就是如你所做的那样,将循环包装在<ol>中,然后根据需要将其包装在<xsl:if>中。