如何根据xslt中以“pro_”开头的属性值选择max xml属性?

时间:2015-07-09 11:29:35

标签: xml xpath

我有一个奇怪的要求来获取以指定字符串开头的最大值.Below是我的示例源代码,正如我们所见, book 元素有一个名为<的属性strong> id ,正如我们所见, id 属性的某些值以“pro _”开头,例如 pro_60 pro_55 ,而其他属性值只是纯数字,例如 70 40

所以我的问题是如何获取以专业_ 开头的属性值,数字是最大数量。在此示例中,最大数字以开头pro _ 65 ,所以预期的结果是 pro_65 ,我可以在我的代码中执行,但我想知道可以我们只是使用 来做到这一点?任何帮助都非常棒!

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>

2 个答案:

答案 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表达式计算。