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 に答える