2012-11-02 5 views
0

У меня есть для каждой группы, подобной той, что приведена ниже, но я хочу, чтобы код выполнялся, только если результат для каждой группы имеет больше, чем 1 группа ... Как я могу это сделать?Тестирование, если для каждой группы возвращается более 1 группы XSL

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

Спасибо!

+1

Cristy, Пожалуйста, обратите внимание, что ответ вы приняли неверен. Вы спрашиваете о * количестве групп *, но принятый ответ - это что-то другое - количество элементов в текущей группе. –

ответ

1

Try:

<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> 
+0

FYI: Я еще не играл с XSLT2, так что это предположение, основанное на функциях, которые я видел в Интернете, - похоже, что у него есть несколько многообещающих функций. – JohnLBevan

+0

Это сработало, мне просто пришлось изменить & gt;>, потому что это вызывало ошибки! благодаря! – Cristy

+0

Не стоит беспокоиться - извините, что & gt; была опечатка - должна быть > - но> также хорошо, если она работает (в VS2010 XSLT1.0 больше, чем знаки в значениях атрибутов, как правило, выделяются как синтаксические ошибки по какой-либо причине, поэтому По умолчанию я начал использовать специальные коды символов). – JohnLBevan

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 

Эта третья альтернатива - лучшее и рекомендуемое выражение для использования.

2

Вы можете просто использовать последний():

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

Это работало для меня

<xsl:if test="count(current-group()) > 1"> 
    <xsl:text>Do Something</xsl:text> 
</xsl:if> 
Смежные вопросы