2010-01-07 2 views
1

Очевидно, что MSXML6 не поддерживает XSLT 2.0, по крайней мере, не функцию max(). Мне нужно узнать узел, который содержит самое высокое значение среди своих братьев и сестер. Они в произвольном порядке.Как получить эквивалент max() на MSXML6?

Я хочу, чтобы заказ оставался идентичным, поэтому добавление order-by и проверка [0] невозможен.

Я хочу сделать это с помощью одного заявления XPath. Я не хочу вызывать шаблоны или включать в себя более сложную логику, чем это. Я уверен, что где-то внедрены ужасающие расширители сценариев MS. Eww.

Я подумал:

elem1[count(../elem1[@value < current()/@value]) = 0] 

Но это не сработало, как я ожидал (возвращает первый узел всегда). Любая другая отличная магия XPath вы можете придумать там?

ответ

4

Попробуйте

elem1[not(../elem1/@value > @value)] 

То есть, вы хотите elem1, для которых это не так, что другой elem1 имеет больший @value.

Вдохновение от this handy page

+0

Работал как шарм, спасибо! –

+3

Стоит упомянуть, что оператор '>' при подаче набора узлов ('../ elem1/@ value') сравнивает все узлы в наборе с' @ значением'. Это также означает, что выражение на самом деле должно быть «elem1 [not (../ elem1/@ value> @value)] [1]', так как может быть более одного узла с тем же максимальным значением. В этом случае все эти узлы возвращаются, хотя вас интересует только один из них. – Tomalak

+0

Хороший улов, хотя всегда выбирает первый узел, когда выражение XPath возвращает набор узлов. Кажется, оно автоматическое. –