筛选使用XPATH 1.0返回的节点集中子字符串的最高值。

时间:2016-03-30 17:00:34

标签: xml xpath

我想获取最新快照的版本号 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 个答案:

答案 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="'&#10;'" />
    <xsl:variable name="highest">
      <xsl:for-each select="a[substring(@href,1,1) > 0 or substring(@href,1,1) &lt; 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],'&#10;')" />
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

但这仅适用于一位数版本的数字。对于几位数版本号,需要采用不同的方法。

答案 1 :(得分:1)

选择包含文本a 的最后一个'SNAPSHOT'元素实际上是可行的,并且适用于您的特定XML示例。您尝试的XPath中只有略微关闭的括号,请尝试这种方式:

(//a[contains(text(),'SNAPSHOT')])[last()]