代码之家  ›  专栏  ›  技术社区  ›  Hinek

XPath获取具有最高ID的元素

  •  12
  • Hinek  · 技术社区  · 14 年前

    XML源:

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

    我需要你的帮助 (所以 <document><id>7</id></document> 在示例中)。我不能更改C代码,它是 XMLDocument.SelectSingleNode(...) ,我只能修改使用的XPath。

    有什么类似的吗 documents/document[id=max(id)] 或者类似的 order by id descending 为了得到它?

    5 回复  |  直到 14 年前
        1
  •  29
  •   alexkb    5 年前
    documents/document[not(../document/id > id)]/id
    
        2
  •  15
  •   user357812 user357812    14 年前

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

    /documents/document[id = max(../document/id)]
    
        3
  •  2
  •   Dirk Vollmar    14 年前

    preceding following

    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>
    
        4
  •  1
  •   jimplode    14 年前

    看看这个链接。 它使用一个函数数学:max().

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

    希望这对你有帮助

        5
  •  0
  •   Mark Thomas    14 年前

    不幸的是,XPath1.0或XPath2.0都没有定义sort()函数。然而,大多数 实施 <xsl:sort> 在XSLT实现中可用,DOM4J有一个sort by XPath方法。我敢肯定C语言中也有类似的东西,但你得稍微修改一下C代码。