3

我有以下示例 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 个元素: //data[position()>last()-3]/*:id,',' 这将返回 id: 4,5,6

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

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

4

1 回答 1

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。

于 2013-11-07T18:42:01.640 回答