我是XPath的新手,我发现要获取最大属性编号,我可以使用下一个语句://Book[not(@id > //Book/@id)
并且它运行良好。
我只是无法理解为什么它返回max id而不是min id,因为它看起来我正在检查一个节点的id是否比任何其他节点id更大,然后返回一个不在其中的Book。
我可能很蠢,但是,请某人,解释一下:)
答案 0 :(得分:1)
您不是要查询最大值,而是查询最小值。您的查询
//Book[not(@id > //Book/@id)
可以翻译成自然语言为“查找所有书籍,其中@id
比任何其他书籍@id
都大”。你可能想用
//Book[not(@id < //Book/@id)
对于任意输入,您可能想要使用<=
,因此它只返回一个最大值(如果共享则不返回)。由于@id
必须是唯一的,因此这并不重要。
请注意//Book[@id > //Book/@id]
不等于上面的查询,尽管数学建议如此。 XPath的比较运算符遵循一种集合语义:如果左侧的任何值大于右侧的任何值,则谓词将为真;因此它将包括所有书籍,但价值最小@id
的书籍。
答案 1 :(得分:0)
除了XPath 1.0,你的功能是正确的,在XPath 2.0中:
/Books/Book[id = max(../Book/id)]
math:max
函数返回作为参数传递的节点的最大值。最大值定义如下。作为参数传递的节点集按降序排序,而xsl:sort
的数据类型为数字。最大值是使用数字函数将此已排序列表中第一个节点的字符串值转换为数字的结果。
如果节点集为空,或者将任何节点的字符串值转换为数字的结果为NaN,则返回NaN。
math:max template返回一个结果树片段,其字符串值是将函数返回的数字转换为字符串的结果。