Как сослаться на текущее значение узла в XSL для каждого теста? - PullRequest
27 голосов
/ 11 февраля 2009

Допустим, у меня есть документ XML, подобный этому:

<books>
    <book>1110</book>
    <book>1111</book>
    <book>1112</book>
    <book>1113</book>
</books>

Я пытаюсь настроить условие, которое проверяет значение текущего узла в for-each, но я делаю что-то не так:

<xsl:for-each select="/books/book">
    <xsl:if test=".[='1112']">
        Success
    </xsl:if>
</xsl:for-each>

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

Ответы [ 5 ]

41 голосов
/ 11 февраля 2009

Использование . может действительно ссылаться на текущий (или «контекстный») узел, но не на то, как вы его здесь используете. В 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>
13 голосов
/ 11 февраля 2009

Я пытаюсь настроить условие, которое проверяет значение текущего узла в для каждого, но я делаю что-то неправильно:

Первое, что неправильно, это синтаксис :

   .[='1112']

Здесь две вещи не так :

  1. Внутри [и] предиката нет : оператору "=" требуется два аргумента, но предоставляется только один.

  2. .[x = y] - все еще недопустимый синтаксис, хотя предикат в порядке . Это должно быть указано как:

    само :: узел () [состояние]

Вторая вещь в предоставленном коде , которую можно улучшить , это инструкция <xsl:for-each>, которая вообще не нужна; Достаточно одного выражения XPath.

Для суммирования , одно из возможных выражений XPath, которое оценивается в требуемое логическое значение:

   /books/book[. = '1112']

Если действительно необходимо проверить условие внутри инструкции <xsl:for-each>, то я бы использовал правильное выражение XPath:

   . = '1112'

Приведенное выше представляет собой сравнение строк, и может не иметь значения true(), если вокруг имеются пробелы. Поэтому численное сравнение может быть лучше :

  . = 1112
3 голосов
/ 23 апреля 2009

XSLT имеет функцию специально для этой проблемы.

http://www.w3.org/TR/xslt#function-current

3 голосов
/ 11 февраля 2009

В то время как Бен правильно ответил на ваш вопрос, использование for-each, безусловно, является неправильным общим подходом. Ведь это XSLT. Так что вы, вероятно, больше ищете что-то вроде этого:

<xsl:if test="/books/book[text()='1112']">
  Success
</xsl:if>
1 голос
/ 15 апреля 2011

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

<xsl:for-each select="/books/book">
    <xsl:if test="current() = '1112'">
        Success
    </xsl:if> 
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...