0

XML:

<node>
  <node date="01-01-2002">Node</node>
  <node date="01-01-2005">Node</node>
  <node date="01-01-2001">Node</node>
  <node date="01-01-2003">Node</node>
  <node date="01-01-2006">Node</node>
  <node>
    <node date="01-01-2000">Node</node>
    <node date="01-01-2007">Node</node>
  </node>
  <node date="01-01-2004">Node</node>
</node>

問題:
日付でソートし、限られた数のソート済みノードを取得する必要があります。任意の数のレベルをトラバースできる必要があります。

必要な結果:

<p>01-01-2000</p>
<p>01-01-2001</p>
<p>01-01-2002</p>
<p>01-01-2003</p>
<p>01-01-2004</p>

前提:
日付で並べ替えるには、タイム スタンプを返す c# 拡張メソッドを使用します。

<xsl:sort select="cs:formatDate(@date)" order="ascending" data-type="number" />

最も古いノードを 5 つに制限します。
順序: 昇順
XSLT 1.0

編集: 要求されたように、これは私がこれまでに得た場所です:ネストされていないノードの並べ替えと制限を行うことができます:

<xsl:template match="node">

  <xsl:apply-templates select="node">
    <xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
    <xsl:with-param name="limit" select="5"/>
  </xsl:apply-templates>


</xsl:template>

<xsl:template match="node[@date]">
  <xsl:param name="limit" />
  <xsl:if test="position() &lt; $limit+1">
    <h5><xsl:value-of select="@date"/></h5>
  </xsl:if>
</xsl:template>

または、以下のようにネストされたノードを申請しようとすると、ネストされたノードが分離してソートされ、同じ方法でそれらを制限できなくなります。

<xsl:template match="*">


    <xsl:apply-templates select="node[@date]">
      <xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
    </xsl:apply-templates>
    <xsl:apply-templates select="node[not(@date)]">
    </xsl:apply-templates>


</xsl:template>



<xsl:template match="node[@date]">
  <h5><xsl:value-of select="@date"/></h5>
</xsl:template>

<xsl:template match="node[not(@date)]">
  <xsl:apply-templates select="node[@date]">
    <xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
  </xsl:apply-templates>
  <xsl:apply-templates select="node[not(@date)]">
  </xsl:apply-templates>
</xsl:template>

編集:

明らかだと思いましたが、おそらくそうではありません。制限の前にソートを適用する必要があります。例: 「最も古い 5 つのノードを取得する」および NOT:「xml から最初の 5 つのノードを取得し、それらを並べ替える」

4

1 に答える 1

2

<xsl:template match="/">
    <xsl:apply-templates select="//node[@date]">
        <xsl:sort select="concat(substring-after(substring-after(@date,'-'),'-'),substring-before(substring-after(@date,'-'),'-'),substring-before(@date,'-'))" order="ascending" data-type="number" />
        <xsl:with-param name="start" select="1"/>
        <xsl:with-param name="end" select="5"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="node">
    <xsl:param name="start" />
    <xsl:param name="end" />
    <xsl:if test="position() &gt;= $start and position() &lt;= $end">
        <p>
            <xsl:value-of select="@date"/>
        </p>
    </xsl:if>
</xsl:template>

于 2013-04-15T09:25:20.740 に答える