Подтвердить что ты не робот

Как обратиться к текущему значению 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>

Что я делаю неправильно?

4b9b3361

Ответ 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>

Ответ 5

Попробуйте с этим

<xsl:for-each select="/books/book">
    <xsl:if test="current() = '1112'">
        Success
    </xsl:if> 
</xsl:for-each>