Как обратиться к текущему значению узла в XSL для - каждый тест?

Стандартный подход заключается в использовании groupby(keys)[column].idxmax(). Однако для выбора нужных строк с помощью idxmax вам нужно idxmax вернуть уникальные значения индекса. Один из способов получить уникальный индекс - вызвать reset_index.

После получения значений индекса из groupby(keys)[column].idxmax() вы можете выбрать всю строку, используя df.loc:

In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()]
Out[20]: 
                       start    end
F_Type to_date                     
A      20150908143000    345    316
B      20150908143000  10743   8803
C      20150908143000  19522  16659
D      20150908143000    433     65
E      20150908143000   7290   7375
F      20150908143000      0      0
G      20150908143000   1796    340

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

27
задан Dimitre Novatchev 11 February 2009 в 02:47
поделиться

4 ответа

Используя . может, действительно, отослать к току (или "контекст") узел, но не способ, которым Вы используете его здесь. В 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>
41
ответ дан Ben Blank 14 October 2019 в 13:21
поделиться

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

первой вещью, которая является неправильной, является синтаксис :

   .[='1112']

существует две вещи неправильно здесь :

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

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

    сам:: узел () [условие]

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

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

   /books/book[. = '1112']

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

   . = '1112'

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

  . = 1112
13
ответ дан Dimitre Novatchev 14 October 2019 в 13:21
поделиться

В то время как Ben ответил на Ваш вопрос правильно, с помощью для - каждый - совершенно определенно неправильный общий подход. В конце концов, это - XSLT. Таким образом, Вы, вероятно, больше ищете что-то вроде этого:

<xsl:if test="/books/book[text()='1112']">
  Success
</xsl:if>
3
ответ дан tcurdt 14 October 2019 в 13:21
поделиться

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

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

3
ответ дан 28 November 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: