Ну, сообщение об ошибке означает, что вы не можете объявить переменную в одном шаблоне или функции, а затем получить доступ к ней в другом. В этом отношении XSLT подобен многим другим обычным языкам программирования: переменная имеет область действия c, которая, по сути, представляет собой инструкции, следующие за объявлением переменной, в том же шаблоне или функции.
И решение обычно это означает передачу значения переменной в качестве параметра функции.
Но теперь я действительно запутался в том, что вы пытаетесь достичь, потому что вы инициализируете переменную, вызывая функцию:
<xsl:variable name="number_of_lines_var" select="mf:number_of_lines()"/>
, а затем в функции, к которой вы пытаетесь получить доступ к значению переменной
<xsl:function name="mf:number_of_lines" as="xs:integer">
<xsl:sequence
select="if (...) then ... else $number_of_lines_var/>
</xsl:function>
, которая кажется полностью круглой.
Попытка выяснить, что вы можете Вы думали, когда писали это, возможно, вы представляли, что вызов функции увеличит значение переменной? Если это так, то, боюсь, вы совершенно не поняли, как работают функциональные языки. Функции не имеют побочных эффектов, а переменные не меняют своего значения.
Я думаю, что решение вашей проблемы совершенно другое и выглядит примерно так:
<xsl:for-each-group select="td" group-starting-with="*[td[1] ne 'skip']">
<xsl:value-of select="count(current-group())-1"/>
</xsl:for-each-group>
Вам нужно немного уточнить это, чтобы иметь дело со строками заголовка и трейлера в таблице, но я оставлю это вам, потому что вы знаете о данных больше, чем я.