Шаблон contextGenerator
неправильно разделяется и рекурсивно. (В аргументе contextGenerator
во втором вызове нет /
, поэтому разбиение завершается неудачно.)
Добавление следующего к шаблону помогает показать проблему:
<xsl:message>
[<xsl:value-of select="$currentContext"/>]
[<xsl:value-of select="$subContext"/>]
</xsl:message>
Выход:
[OutputParent]
[OPChild]
[]
[]
Следующий шаблон замены производит правильный вывод:
<xsl:template name="contextGenerator">
<xsl:param name="contextPath" as="xs:string?"/>
<xsl:choose>
<xsl:when test="contains($contextPath, '/')">
<xsl:element name="{substring-before($contextPath, '/')}">
<xsl:variable name="subContext"
select="substring-after($contextPath, '/')"/>
<xsl:if test="$subContext">
<xsl:call-template name="contextGenerator">
<xsl:with-param name="contextPath" select="$subContext"/>
</xsl:call-template>
</xsl:if>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{$contextPath}"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Результат:
<OutputParent>
<OPChild/>
</OutputParent>