Вам не нужно for-each
. Предполагая, что узел контекста является элементом MVKE
(как в вашем примере), следующее выражение возвращает true
, когда все элементы VMSTA
имеют строковое значение, равное 2
(и false
, когда присутствует любое другое значение ):
not(item/VMSTA[not(.='2')])
Это работает из-за неявного преобразования item/VMSTA[not(.='2')]
в логическое значение. Логическое значение набора узлов равно true
тогда и только тогда, когда оно не пустое. Следовательно, item/VMSTA[not(.='2')]
равен true
всякий раз, когда он выбирает хотя бы один узел, то есть, когда существует элемент VMSTA
, строковое значение которого не равно 2
. Заключение выражения в not()
приводит к его отрицанию, что является желаемым результатом.
Полный пример:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="xml" encoding="UTF-8"/>
<xsl:template match="/">
<list><xsl:apply-templates select="MVKE"/></list>
</xsl:template>
<xsl:template match="MVKE">
<flag><xsl:value-of select="not(item/VMSTA[not(.='2')])"/></flag>
</xsl:template>
</xsl:stylesheet>