@ Томалак всегда побеждает меня (с лучшим и более подробным ответом)!
Проблема чередования строк заключается в двух строках:
<xsl:for-each select="case-studies/case-study/category[. = $catName]">
и
<xsl:if test="@solution[. = $solName]">
В результате вы выбираете набор узлов, соответствующий вышеуказанному условию предиката. Процессор запоминает это до конца цикла. Затем вы применяете другое условие, которое дополнительно ограничивает обрабатываемые узлы (но не зацикливается).
Вы проверяете положение в цикле, используя функцию position()
, которая содержит общее число. узлов, соответствующих циклу <xsl:for...
(, не исключая узлы, отфильтрованные по условию <xsl:if
. )
Решением было бы объединить условия xsl:for-each
и xsl:if
:
<xsl:for-each select="case-study/category[. = $catName and @solution = $solName]">
Конечно, это объяснение только для иллюстрации сути. Идея Томалака о том, чтобы избегать использования for-each, очень верна, и его решение просто потрясающе.