我们说我们有以下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>
我们试图找到的是&#34; name&#34; &#34;主题&#34;哪里&#34;彼得&#34; &#34;等级&#34;中的人数最多。整个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)
工作正常并输出正确的最大值。这让我相信问题在于我使用[]。
答案 0 :(得分:0)
我用this parser尝试了这个,然后返回&#34;编程&#34;。不确定它是否适用于您正在使用的那个:
SELECT DISTINCT A.HP_EXR_ID
FROM db2prod.PRV_BPDE_PRV_MHG A
,db2prod.T401ALTC B
,db2prod.T401APFN C
,db2prod.t401ahpa D
WHERE A.HP_ID = B.HP_ID
and A.HP_ID = C.HP_ID
and A.HP_ID = D.HP_ID
and a.DBMS_LOB.INSTR(MHG_BPDE_DTA_XML_TX,c.pfn_prv_lst_name) > 0)
and a.DBMS_LOB.INSTR(MHG_BPDE_DTA_XML_TX,c.pfn_prv_fst_name(1:4)) > 0)
and a.DBMS_LOB.INSTR(MHG_BPDE_DTA_XML_TX,d.HP_ADDR_STR_ADDR(1:8) > 0)
and a.DBMS_LOB.INSTR(MHG_BPDE_DTA_XML_TX,d.mn_zip_addr(1:3)) > 0)
and a.DBMS_LOB.INSTR(MHG_BPDE_DTA_XML_TX,d.pol_rgn_code > 0)
AND B.HP_ALRT_TYP_CD IN ('G1')
AND B.HP_ALRT_TYP_STA_CD = 'A'
AND B.ANW_TSP_GRP =
(SELECT MAX(BB.ANW_TSP_GRP)
FROM db2prod.T401ALTC BB
WHERE BB.HP_ID = B.HP_ID
AND BB.HP_ALRT_TYP_CD = B.HP_ALRT_TYP_CD);
答案 1 :(得分:0)
您使用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。