我想使用xpath 1.0获取最新快照的版本号 . 在这个例子中它将是0.0.3-SNAPSHOT .
<html>
<head><title>Title</title>
</head>
<body>
<h1>Index </h1>
<pre>Name </pre><hr/>
<pre><a href="../">../</a>
<a href="0.0.1-SNAPSHOT/">0.0.1-SNAPSHOT/</a>
<a href="0.0.2-SNAPSHOT/">0.0.2-SNAPSHOT/</a>
<a href="0.0.3-SNAPSHOT/">0.0.3-SNAPSHOT/</a>
<a href="metadata.xml">metadata.xml</a>
</pre>
</body></html>
我这样做了
xpath snapshot.xml "(//a)[last()-1]"
我不习惯假设快照版本的最高值始终位于last() - 1-SNAPSHOT的索引位置 .
我可以假设值(0.0.1,0.0.2)将始终从文档的顶部到底部递增 .
我想编写一个xpath表达式来执行以下操作
1)解析完整节点集以仅返回包含字符串SNAPSHOT的锚链接
预期结果
> 0.0.1-SNAPSHOT/
> 0.0.2-SNAPSHOT/
> 0.0.3-SNAPSHOT/
我成功了 . 使用谓词有几种方法可以做到这一点
xpath snapshot.xml“(// pre / a / text()[contains( . ,'SNAPSHOT')]”xpath snapshot.xml“(// a / text()[contains( . ,'SNAPSHOT')]”
但是返回了太多的节点,所以我想过滤它们
2a)获取集合中的最后一个节点,这似乎不可能,因为contains()返回的字符串不是节点集
我这样失败了
xpath snapshot.xml "(//a)[contains(text(),'SNAPSHOT')last()]"
xpath snapshot.xml "(//a)[contains(text(),'SNAPSHOT')][last()]"
xpath snapshot.xml "(//a)[not ( contains(text(),'SNAPSHOT') ) < text()]"
2b)获取具有最高值的节点 . 这意味着如果字符串是“0.0.3-SNAPSHOT”,则在-SNAPSHOT之前选择子串0.0.1,0.0.2和0.0.3并获得最大值 .
然后我就这样失败了
xpath snapshot.xml "(//a)[ not(../a/text() > text()) ]"
我正在使用https://www.w3.org/TR/xpath作为指导 .
如何筛选使用XPATH 1.0返回的节点集中子字符串的最高值 . 在这种情况下是否可能?
2 回答
选择包含文本
'SNAPSHOT'
的最后一个a
元素实际上是可行的,并且适用于您的特定XML示例 . 尝试使用XPath中的括号略有偏差,请尝试以下方式:您可以通过
@href
属性的词法排序来执行此操作 . 因为数字在词汇上排序很好,所以这是可能的 . 在@href
属性上以降序应用xsl:sort
可以很好地对版本进行排序,并提取第一个元素可以获得所需的结果 . 其余的只是门面 . 所以试试这个:但这仅适用于一位数版本的数字 . 对于几位数版本号,需要采用不同的方法 .