我有一个奇怪的要求来获取以指定字符串开头的最大值.Below是我的xml示例源代码,正如我们所见, book 元素有一个名为<的属性strong> id ,正如我们所见, id 属性的某些值以“pro _”开头,例如 pro_60 , pro_55 ,而其他属性值只是纯数字,例如 70 , 40 。
所以我的问题是如何获取以专业_ 开头的属性值,数字是最大数量。在此示例中,最大数字以开头pro _ 65 ,所以预期的结果是 pro_65 ,我可以在我的java代码中执行,但我想知道可以我们只是使用xpath 来做到这一点?任何帮助都非常棒!
XPath版本为1.0 。
<?xml version="1.0" encoding="UTF-8"?>
<datas>
<books>
<book id="pro_60">Java</book>
<book id="pro_55">Golang</book>
<book id="pro_40">PHP</book>
<book id="pro_65">C++</book>
<book id="pro_55">Python</book>
<book id="70">Javascript</book>
<book id="40">HTML5</book>
</books>
</datas>
答案 0 :(得分:1)
使用XPath 2.0:
/datas/books/book/@id[starts-with(., 'pro_')][not(../../book/@id/number(substring-after(., 'pro_')) > number(substring-after(., 'pro_')))]
因为它取决于在计算原子值序列的路径的最后一步中使用函数调用的功能,所以它不能直接转换为XPath 1.0。
答案 1 :(得分:1)
更短的XPath 2.0表达式:
max(/*/*/*/@id[starts-with(.,'pro_')]/number(substring(.,5)))
这只是计算最大值。
要选择具有此最大值的id
属性的所有元素,请使用:
(/*/*/*[@id = concat('pro_', string(max(/*/*/*/@id[starts-with(.,'pro_')]/number(substring(.,5)))))]
对于XPath 1.0,无法使用单个XPath 1.0表达式计算。