我想获取最新快照的版本号 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返回的节点集中子字符串的最高值。在这种情况下是否可能?
答案 0 :(得分:1)
您可以对@href
属性进行词法排序。因为数字在词汇上排序非常好,所以这是可能的。在xsl:sort
属性上使用降序排列@href
可以很好地对版本进行排序,并提取第一个元素可以获得所需的结果。其余的只是外观。所以试试这个:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="text()" />
<xsl:template match="/html/body/pre">
<xsl:value-of select="' '" />
<xsl:variable name="highest">
<xsl:for-each select="a[substring(@href,1,1) > 0 or substring(@href,1,1) < 10]">
<xsl:sort select="@href" order="descending" />
<r><xsl:value-of select="normalize-space(.)" /></r>
</xsl:for-each>
</xsl:variable>
<xsl:if test="$highest != ''">
<xsl:value-of select="concat('Latest version is: ',$highest/r[1],' ')" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
但这仅适用于一位数版本的数字。对于几位数版本号,需要采用不同的方法。
答案 1 :(得分:1)
选择包含文本a
的最后一个'SNAPSHOT'
元素实际上是可行的,并且适用于您的特定XML示例。您尝试的XPath中只有略微关闭的括号,请尝试这种方式:
(//a[contains(text(),'SNAPSHOT')])[last()]