XPath获取具有最高ID的元素

时间:2010-09-24 11:10:16

标签: .net xpath

XML来源:

<documents>
    <document>
        <id>3</id>
    </document>
    <document>
        <id>7</id>
    </document>
    <document>
        <id>1</id>
    </document>
</documents>

我需要在其id-element中具有最高值的document元素(在示例中为<document><id>7</id></document>)。我无法更改C#代码,它是XMLDocument.SelectSingleNode(...),我只能修改使用的XPath。

是否有类似documents/document[id=max(id)]或类似order by id descending的内容来获取它?

5 个答案:

答案 0 :(得分:27)

documents/document[not(../document/id > id)]/id

答案 1 :(得分:11)

除了Nick Jones XPath 1.0正确答案,在XPath 2.0中:

/documents/document[id = max(../document/id)]

答案 2 :(得分:2)

您可以使用precedingfollowing 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(. &lt;= preceding::document/id) 
                     and not(. &lt;= following::document/id)]"/>
      </root>
    </xsl:template>
</xsl:stylesheet>

答案 3 :(得分:1)

对此链接有所了解。 它使用函数math:max()。

该功能有一个源链接,并解释了如何实现它

http://www.exslt.org/math/functions/max/index.html

希望这有助于你

答案 4 :(得分:0)

不幸的是,XPath 1.0或XPath 2.0都没有定义sort()函数。但是,大多数实现都有排序。例如,<xsl:sort>在XSLT实现中可用,而DOM4J通过XPath方法排序。我确信在C#中有类似的东西,但你必须稍微更改一下C#代码。