Вы можете использовать preceding
и following
XPath осей, чтобы проверить, есть ли не большее значение:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<documents>"
+ " <document><id>3</id></document>"
+ " <document><id>7</id></document>"
+ " <document><id>1</id></document>"
+ "</documents>");
var max = doc.SelectSingleNode(
"/documents/document[not(id < preceding::document/id)
and not(id < following::document/id)]");
Если имеется несколько максимальных значений идентификаторов в документе выше код будет возвращать первый. Если вы хотите, чтобы последний элемент с максимальным идентификатором вы можете использовать
var max = doc.SelectSingleNode(
"/documents/document[not(id < preceding::document/id)
and not(id <= following::document/id)]");
Если вы хотите, чтобы получить список всех элементов, имеющих максимальный идентификатор, вы можете использовать SelectNodes
метод:
var maxList = doc.SelectNodes(
"/documents/document[not(id < preceding::document/id)
and not(id < following::document/id)]");
XSLT версии :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:value-of
select="/documents/document/id[not(. <= preceding::document/id)
and not(. <= following::document/id)]"/>
</root>
</xsl:template>
</xsl:stylesheet>
+1 Для кратчайшего и правильного выражения XPath 1.0, помимо сложности cuadratic ... – 2010-09-24 12:13:28
спасибо, отличное решение, вы должны получить бонусные баллы за этот! – Hinek
Умное решение! –