есть ли способ, как я могу просто объявить глобальную переменную, а затем назначить некоторые
значение в первом для цикла и использовать эту переменную во втором для цикла?
Способ присвоения значения xsl:variable
(конечно, это только инициализация) из xsl:for-each
состоит в том, чтобы включить xsl:for-each
в тело переменной .
Вот полный пример:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:variable name="vMax">
<xsl:for-each select="num">
<xsl:sort data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
Values close to the maximum:
<xsl:text/>
<xsl:for-each select="num">
<xsl:if test="not($vMax - . > 3) ">
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML ...
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
... сначала он определяет переменную vMax
, которая получает свое значение из xsl:for-each
, содержащегося в его теле.
Затем переменная vMax
используется во втором xsl:for-each
для вывода всех чисел, которые «близки» к вычисленному максимуму.
Требуется правильный результат :
Values close to the maximum:
07
08
09
10
Также можно смоделировать «назначение» переменной с разными значениями, используя рекурсивно названный именованный шаблон, и передать «новое значение» в качестве параметра вызываемому шаблону .
Вот пример, демонстрирующий эту технику. Здесь мы вычисляем максимум значений, содержащихся в узлах набора узлов. Каждый раз, когда мы получаем доступ к следующему узлу в наборе узлов, текущий максимум сравнивается с этим значением, и при необходимости новый максимум становится значением следующего узла. Затем мы рекурсивно вызываем тот же шаблон, передавая в качестве значения текущего максимума новый максимум:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:call-template name="max">
<xsl:with-param name="pList" select="*"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="max">
<xsl:param name="pMax" select="-99999999"/>
<xsl:param name="pList"/>
<xsl:choose>
<xsl:when test="$pList[1]">
<xsl:variable name="vnewMax" select=
"$pMax * ($pMax >= $pList[1])
+
$pList[1] * not($pMax >= $pList[1])
"/>
<xsl:call-template name="max">
<xsl:with-param name="pMax" select="$vnewMax"/>
<xsl:with-param name="pList" select="$pList[position() > 1]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$pMax"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к тому же XML-документу (см. Выше), получается требуемый, правильный результат :
10