假设我们有以下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] 删除。
我来说两句