首页 文章

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

提问于
浏览
0

我想使用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 回答

  • 1

    选择包含文本 'SNAPSHOT' 的最后一个 a 元素实际上是可行的,并且适用于您的特定XML示例 . 尝试使用XPath中的括号略有偏差,请尝试以下方式:

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

    您可以通过 @href 属性的词法排序来执行此操作 . 因为数字在词汇上排序很好,所以这是可能的 . 在 @href 属性上以降序应用 xsl:sort 可以很好地对版本进行排序,并提取第一个元素可以获得所需的结果 . 其余的只是门面 . 所以试试这个:

    <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>
    

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

相关问题