测试for-each-groups是否返回多于1个组的XSL

时间:2012-11-02 19:34:22

标签: xslt xpath xslt-2.0

我有一个for-each组,如下所示,但我只想让代码执行,如果for-each-group的结果有多个组...我怎么能这样做?

<xsl:for-each-group select="course[$department = department/@code]" group-by="course_group[@code]">

谢谢!

4 个答案:

答案 0 :(得分:2)

你可以简单地使用last():

<xsl:for-each-group select="..." group-by="...">
  <xsl:if test="last() gt 1">
    ...
  </xsl:if>
</xsl:for-each-group>

答案 1 :(得分:1)

尝试:

<xsl:for-each-group select="course[$department = department/@code]" group-by="course_group[@code]">
  <xsl:if test="count(current-group()) &gt; 1">
    <xsl:text>Do Something</xsl:text>
  </xsl:if>
</xsl:for-each-group>

答案 2 :(得分:1)

使用

<xsl:variable name="vGroups" as="item()*">
  <xsl:for-each-group select=
   "course[$department = department/@code]" group-by="course_group[@code]"
  >1</xsl:for-each-group>
</xsl:variable>

<xsl:for-each-group select=
 "course[$vGroups[2]][$department = department/@code]" group-by="course_group[@code]">
    <!-- Your desired processing here -->
</xsl:for-each-group>

因此,第一个<xsl:for-each-group>为每个组生成一个项目,并在$vGroups变量中捕获。

第二个<xsl:for-each-group>具有附加条件[$vGroups[2]],并且仅当序列$vGroups包含至少两个项目时才会选择任何组(并执行)。

或者,可以使用

exists(distinct-values(course[$department = department/@code]/course_group[@code])[2])

或者,(为什么我忘记了这一点)正如迈克尔凯的答案所指出的,人们可以简单地使用:

last() gt 1

第三种选择是使用的最佳和推荐的表达方式。

答案 3 :(得分:0)

这对我有用

<xsl:if test="count(current-group()) > 1">
    <xsl:text>Do Something</xsl:text>
</xsl:if>