假设我们有以下 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>
我们试图找到的是“科目”的“名称”,其中“Peter”在“年级”中的数字最多。整个 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 错误,则可能是我手动将其翻译成英语时出现了问题。
EDIT:
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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)