xsl:for-each
не является циклом, и требуемый результат может быть достигнут без цикла или рекурсии.
Дано:
XML
<Data>
<Subject>
<SubTest SubFlag="1" System="OK"> </SubTest>
<SubTest SubFlag="csdcd" System="OK"> </SubTest>
<SubTest SubFlag="zxczx" System="OK"> </SubTest>
</Subject>
<TempData CurrentSubFlag="abc"/>
</Data>
следующая таблица стилей:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TempData">
<xsl:variable name="index" select="count(/Data/Subject/SubTest[not(@SubFlag=1 and @System='OK')][1]/preceding-sibling::SubTest) + 1" />
<TempData CurrentSubFlag="{$index}"/>
</xsl:template>
</xsl:stylesheet>
вернет:
Результат
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Subject>
<SubTest SubFlag="1" System="OK"/>
<SubTest SubFlag="csdcd" System="OK"/>
<SubTest SubFlag="zxczx" System="OK"/>
</Subject>
<TempData CurrentSubFlag="2"/>
</Data>
Добавлено:
Чтобы учесть добавленные вами условия, попробуйте:
<xsl:template match="TempData">
<xsl:variable name="fail" select="/Data/Subject/SubTest[not(@SubFlag=1 and @System='OK')]" />
<xsl:choose>
<xsl:when test="$fail">
<TempData CurrentSubFlag="{count($fail[1]/preceding-sibling::SubTest) + 1}"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>