Ваши xsl: if, xsl: value-of и xsl: variable все должны существовать внутри xsl: template, xsl: variable или xsl: param, я не уверен, что это не так.
xsl: template должен быть дочерним только для xsl: stylesheet.
Вам необходимо удалить определения шаблона изнутри первого <xsl:template match="/">
Определите отдельный шаблон incrementValue и поместите содержимое другого шаблона в основной <xsl:template match="/">
так что у вас есть что-то вроде этого:
<xsl:stylesheet version = '2.0'
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes"
xmlns:mngi="www.medianewsgroup.com"
exclude-result-prefixes="xs xdt mngi dirReader"
xmlns:date="http://exslt.org/dates-and-times"
xmlns:utildate="xalan://java.util.Date"
xmlns:dirReader="xalan://com.mngi.eidos.util.DirectoryReader"
extension-element-prefixes="date utildate dirReader">
<xsl:strip-space elements="*"/>
<xsl:output method="xml"
indent="yes"
encoding="utf-8"
doctype-system="/SysConfig/Classify/Dtd/MNG/classify-story.dtd"/>
...
<xsl:variable name="totalPhotos" select="dirReader:totalPhotos($PhotoPath)"/>
...
<xsl:template match="/">
...
<xsl:if test="$totalPhotos > 0">
<photoName>
<!--xsl:value-of select="$currentIdx"/-->
<xsl:variable name="photoFromIndex" select="dirReader:photoNameWithIndex($currentIdx,$PhotoPath)"/>
<xsl:value-of select="concat($PhotoPath,'',$photoFromIndex)"/>
</photoName>
<xsl:call-template name="incrementValue">
<xsl:with-param name="currentIdx" select="$currentIdx"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="incrementValue">
<xsl:param name="currentIdx"/>
<xsl:if test="$currentIdx < $totalPhotos">
<xsl:value-of select="$currentIdx"/>
<photoName>
<xsl:variable name="photoFromIndex" select="dirReader:photoNameWithIndex($currentIdx,$PhotoPath)"/>
<xsl:value-of select="concat($PhotoPath,'',$photoFromIndex)"/>
</photoName>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
РЕДАКТИРОВАТЬ: переменные, используемые в обоих шаблонах, должны быть объявлены глобально, как я сделал с <xsl:variable name="totalPhotos" select="dirReader:totalPhotos($PhotoPath)"/>
выше, чтобы они были доступны для обоих шаблонов, потому что в данный момент они ограничены только тем шаблоном, в котором они находятся. Или вы можете передайте их как параметры, как это сделано с <xsl:with-param name="currentIdx" select="$currentIdx"/>
. Если существуют переменные, которые существуют только в шаблоне incrementValue, переместитесь из основного шаблона в этот.
ВНИМАНИЕ: Это не проверено, так как я не до конца понимаю проблему из-за недостатка ввода, поэтому я только разбираюсь в синтаксисе.