XPath max函数和括号的使用

时间:2018-03-13 18:30:28

标签: xml xpath

我们说我们有以下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)

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

2 个答案:

答案 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。