2016-03-30 5 views
0

xpath 1.0を使用して、最新のスナップショットのリリース番号を取得します。この例では0.0.3-SNAPSHOTになります。XPATH 1.0を使用して返されたノードセット内の部分文字列の最高値のフィルタ。

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

私はイムは、スナップショットのバージョンのhightest値は 常に最後のインデックス位置()になりますと仮定に慣れていない

xpath snapshot.xml "(//a)[last()-1]" 

を使用してこれを行ってきた - 1-SNAPSHOT。

値(0.0.1、0.0.2)は常にドキュメントの上から下に向かって増加すると仮定できます。私は、次の

1を行うにはXPath式を書きたいと思い

は)私がした文字列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(。含まれているため、「スナップショット」)]」しかし、あまりにも多くのノードが、私は、その後のいずれか

2aでフィルタリングしたいと思いますので、返され

は))(可能なように見えるリターンをdoesntのセット、の最後のノードを取得します。文字列ではない私は、この

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.1を選択し、「0.0.3-SNAPSHOT」である場合を意味し、どの、0.0.2と0.0.3の前に-SNAPSHOTとmax値。

そして私は私が指導のためhttps://www.w3.org/TR/xpathを使用しています。この

xpath snapshot.xml "(//a)[ not(../a/text() > text()) ]" 

のように失敗しました。

XPATH 1.0を使用して返されたノードセット内の部分文字列の最高値をフィルタする方法を教えてください。この場合も可能ですか?

答えて

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> 

しかし、これは1桁のバージョン番号でのみ機能します。数桁のバージョン番号については、異なるアプローチが必要です。

関連する問題