XPath max函数和括号的使用

内菲林

假设我们有以下XML:

<people>
  <student name="Peter">
    <subject>
      <name>English</name>
      <grade>60</grade>
    </subject>
    <subject>
      <name>Programming</name>
      <grade>70</grade>
    </subject>
    <diploma>80</diploma>
  </student>
</people>

我们试图找到的是“主题”的“名称”,其中“彼得”在“成绩”中的数字最大。整个XML还有另外几个人使用不同的名称,但是我认为这并不重要。它们都遵循相同的原理。

这个XPath如何失败:

people/student[@name="Peter"][max(subject/grade)]/subject/name

该错误称为:

NO MATCH!

如果必须在计算最大值后打印出其他值,则我永远无法正确使用max函数。

我还在XMLLINT上花了很多时间,试图使其在Xpath1.0中工作

xmllint --xpath 'people/student[name='Peter'][not(subject/grade > subject/grade)]/subject/grade' grades.xml >result.txt

返回:

XPath set is empty

我已经阅读了这些功能,所以我将欣赏代码示例,而不是文档链接。如果您发现XML错误,则可能是我手动将其翻译成英文时出现的问题。

编辑:

people/student[@name="Peter"]/max(subject/grade)

工作正常,并输出正确的最大值。这使我相信问题出在我对[]的使用上。

丹尼尔·海利

您对的使用max()无效,因为您没有将max()与任何东西进行比较。

这里有几个选择...

XPath 2.0

/people/student[@name="Peter"]/subject[grade = max(../subject/grade)]/name

XPath 1.0

/people/student[@name="Peter"]/subject[not(preceding-sibling::subject/grade > grade) and not(following-sibling::subject/grade > grade)]/name

请注意,xmllint仅支持XPath 1.0。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章