Ответ 1
documents/document[not(../document/id > id)]/id
Источник XML:
<documents>
<document>
<id>3</id>
</document>
<document>
<id>7</id>
</document>
<document>
<id>1</id>
</document>
</documents>
Мне нужен элемент document с наивысшим значением в его id-element (поэтому <document><id>7</id></document>
в этом примере). Я не могу изменить код С#, это XMLDocument.SelectSingleNode(...)
, я могу только изменить используемый XPath.
Есть ли что-то вроде documents/document[id=max(id)]
или как order by id descending
, чтобы получить его?
documents/document[not(../document/id > id)]/id
Помимо правильного ответа Nick Jones XPath 1.0, в XPath 2.0:
/documents/document[id = max(../document/id)]
Вы можете использовать оси 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)]");
Если в документе указано несколько максимальных значений id, приведенный выше код вернет первый. Если вы хотите использовать последний элемент с максимальным id, вы можете использовать
var max = doc.SelectSingleNode(
"/documents/document[not(id < preceding::document/id)
and not(id <= following::document/id)]");
Если вы хотите получить список со всеми элементами с максимальным 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>
Есть гангер по этой ссылке. Он использует функцию math: max().
Существует ссылка для источника для этой функции и объясняется, как она может быть реализована
http://www.exslt.org/math/functions/max/index.html
Надеюсь, это поможет вам
К сожалению, ни XPath 1.0, ни XPath 2.0 не определяют функцию sort(). Однако большинство реализаций имеют вид. Например, <xsl:sort>
доступен в реализациях XSLT, а DOM4J имеет сортировку методом XPath. Я уверен, что есть что-то подобное в С#, но вам придется немного изменить код С#.