Как обратиться к текущему значению node в XSL для каждого теста?
Скажем, у меня есть XML-документ, похожий на это:
<books>
<book>1110</book>
<book>1111</book>
<book>1112</book>
<book>1113</book>
</books>
Я пытаюсь установить условие, которое проверяет значение текущего node в for-each
, но я делаю что-то неправильно:
<xsl:for-each select="/books/book">
<xsl:if test=".[='1112']">
Success
</xsl:if>
</xsl:for-each>
Что я делаю неправильно?
Ответы
Ответ 1
Использование .
может действительно ссылаться на текущий (или "контекст" ) node, но не на то, как вы его используете здесь. В XPath .[foo]
недействителен синтаксис - вместо этого вам нужно использовать self::node()[foo]
. Кроме того, оператору =
нужно что-то соответствовать, в этом случае селектор text()
для доступа к содержимому текста элемента:
<xsl:for-each select="/books/book">
<xsl:if test="self::node()[text()='1112']">
Success
</xsl:if>
</xsl:for-each>
Однако, как указано в других ответах, если ваш for-each
не выполняет другие операции, вам не нужно вообще перебирать и использовать только if
для выполнения той же задачи:
<xsl:if test="/books/book[. = 1112]">
Success
</xsl:if>
Ответ 2
Я пытаюсь установить условие, которое проверяет значение текущего node в для каждого, но я делаю что-то не так:
Первое, что неверно, это синтаксис:
.[='1112']
Здесь есть две вещи::
-
Внутри [и] предиката нет: оператору "=" нужны два аргумента, но предоставляется только один.
-
.[x = y]
по-прежнему является недопустимым синтаксисом, хотя предикат ОК. Это должно быть указано как:
само:: node() [состояние]
Вторая вещь в предоставленном коде , который может быть улучшен, - это инструкция <xsl:for-each>
, которая вообще не нужна; Единственного выражения XPath будет достаточно.
Подводя итог, одно возможное выражение XPath, которое оценивает требуемое логическое значение, следующее:
/books/book[. = '1112']
Если действительно необходимо, чтобы условие проверялось внутри инструкции <xsl:for-each>
, тогда одно правильное выражение XPath, которое я бы использовал, следующее:
. = '1112'
Вышеупомянутый представляет собой сравнение строк, а может не оцениваться до true()
, если вокруг есть пробелы. Поэтому числовое сравнение может быть лучше:
. = 1112
Ответ 3
Хотя Бен правильно ответил на ваш вопрос, использование для каждого из них, безусловно, является неправильным общим подходом. В конце концов, это XSLT. Таким образом, вы, вероятно, больше ищете что-то вроде этого:
<xsl:if test="/books/book[text()='1112']">
Success
</xsl:if>
Ответ 4
XSLT имеет функцию специально для этой проблемы.
http://www.w3.org/TR/xslt#function-current
Ответ 5
Попробуйте с этим
<xsl:for-each select="/books/book">
<xsl:if test="current() = '1112'">
Success
</xsl:if>
</xsl:for-each>