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
的内容来获取它?
答案 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)
您可以使用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>
答案 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#代码。