如何使用XPath选择最新/最新(基于时间戳)的N个元素?

时间:2013-10-25 14:37:26

标签: xml xpath

我有以下示例xml:

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

我可以使用以下xpath获取最后3个元素: //数据[位置()&GT;最后() - 3] / *:ID, '' 这将返回id:4,5,6

我需要的是获得具有最新(最大)时间戳的3个元素。我可以使用max函数来获取最新元素(但我想要n = 3个最新元素) - t.i元素的id为3,4,6。

这只能使用xpath吗?我使用XPath 2.0。

1 个答案:

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

首先,您使用translate()从时间戳中删除非数字字符,这有效地将其转换为可以轻松排序的数字。

然后您对列表进行排序并仅输出前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

使用内置于.Net的XSLT转换进行测试。它使用XPath 1.0。