我有以下示例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。
答案 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() < 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。