2013-10-25 41 views
3

我具有以下示例XML:如何使用XPath選擇最新/最新(基於時間戳)的N個元素?

<datas> 
    <data> 
     <id>1</id> 
     <timestamp>2013-01-19T14:20:01.000+02:00</timestamp> 
    </data> 
    <data> 
     <id>2</id> 
     <timestamp>2013-09-13T14:52:34.000+02:00</timestamp> 
    </data> 
    <data> 
     <id>3</id> 
     <timestamp>2013-10-02T12:47:47.000+02:00</timestamp> 
    </data> 
    <data> 
     <id>4</id> 
     <timestamp>2013-10-23T14:52:08.000+02:00</timestamp> 
    </data> 
    <data> 
     <id>5</id> 
     <timestamp>2013-07-23T14:55:20.000+02:00</timestamp> 
    </data> 
    <data> 
     <id>6</id> 
     <timestamp>2013-10-02T12:44:24.000+02:00</timestamp> 
    </data> 
    </datas> 

我可以得到過去的3個元素與以下XPath: //數據[位置()>最後() - 3]/*:ID, '' 這將返回id:4,5,6

我需要的是獲取3個元素與最新(最大)時間戳。我可以使用max函數來獲取最新元素(但是我想要n = 3個最新元素) - t.i元素的id:3,4,6。

這可能只使用xpath?我使用XPath 2.0。

+0

使用XPath 2.0肯定可行。你正在使用哪個版本? –

+0

@MichaelKay:這是真的嗎?到目前爲止,我只發現有關在_pure_ XPath中排序的負面答案。什麼似乎可用。儘管如此,它們是各種編程語言和框架中的助手類,它們增加了排序功能。如果您無法訪問這些內容,但必須依賴單個XPath表達式,那麼我認爲您運氣不佳。 –

+0

也許我第一次沒有仔細閱讀這個問題,一週後我不確定我在想什麼。它 –

回答

0

這裏是一個純粹的XPath的解決方案,這是一個有點髒,但它的工作:

<ul> 
<xsl:for-each select="datas/data"> 
    <xsl:sort select="translate(translate(translate(translate(translate(timestamp,'-',''),':',''),'.',''),'+',''),'T','')" data-type="number" order="descending" /> 
    <xsl:if test="position() &lt; 4"> 
     <li> 
     <xsl:value-of select="id" /> - 
     <xsl:value-of select="timestamp" /> 
     </li> 
    </xsl:if> 
</xsl:for-each> 
</ul> 

首先使用轉換()從時間戳,從而有效地把它變成了一些刪除非數字字符,可以很容易地排序。

然後您對列表進行排序並僅輸出前3個項目。

的輸出是下面的:

4 - 2013-10-23T14:52:08.000+02:00 
3 - 2013-10-02T12:47:47.000+02:00 
6 - 2013-10-02T12:44:24.000+02:00 

這是使用內置到淨XSLT轉換測試。它使用XPath 1.0。