2009-08-12 7 views
2

"DueDate"という要素が出てこないXMLソースから、指定された数の要素をレンダリングする必要があります。ここで、XMLの例である:XSLTにはどのように限られた数の要素をレンダリングするのですか?

<Items> 
    <Item> 
    <Title>Title 1</Title> 
    <DueDate>01-02-2008</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 2</Title> 
    <DueDate>01-02-2009</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 3</Title> 
    <DueDate>01-02-2010</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 4</Title> 
    <DueDate>01-02-2011</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 5</Title> 
    <DueDate>01-02-2012</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 6</Title> 
    <DueDate>01-02-2013</DueDate> 
    </Item> 
</Items> 

表示する要素の数と、現在の日付がPARAMATERSとしてXSLTに渡されます。 Xsltのfor-eachループでレンダリングされる要素の数を数えることはできますか?それとも良い方法がありますか?

たとえば、制限が3つの要素に設定されている可能性があります。この例では、「タイトル3」、「タイトル4」、「タイトル5」という結果が表示されます。

答えて

0

主な問題は、あなたの入力XMLが有用「YYYY-MM-DD」フォーマットに準拠していないということです。これにより、これらのアイテムの並べ替え/フィルタリングには、 の後ろに痛みがあります。 の背後にあります。

私が正しくあなたを理解していれば、あなたが期日に

  • フィルタに必要な最初の
  • はまでのすべての<Item> Sを選択するためのXPathその

後に出力する最大値を適用します最高支払期限は次のようになります。

Item[ 
    substring-before(DueDate, '-') 
    &lt;= 
    substring-before($MaxDueDate, '-') 

    and 

    substring-before(substring-after(DueDate, '-'), '-') 
    &lt;= 
    substring-before(substring-after($MaxDueDate, '-'), '-') 

    and 

    substring-after(substring-after(DueDate, '-'), '-') 
    &lt;= 
    substring-after(substring-after($MaxDueDate, '-'), '-') 
][ 
    position() &lt;= $MaxCount 
] 
Item[ 
    DueDate &lt;= $MaxDueDate 
][ 
    position() &lt;= $MaxCount 
] 

をので、これらの要素のみをコピーするために、あなたが行く:あなたは 'YYYY-MM-DD' があった場合3210は今さかのぼり、些細な道にいることを比較したパラメータ値について

<xsl:template match="Items"> 
    <xsl:copy> 
    <xsl:copy-of select=" 
     { the expression I gave above } 
    " /> 
    </xsl:copy> 
</xsl:template> 

それぞれ'01-02-2012'4、の、私が取得:

<Items> 
    <Item> 
    <Title>Title 1</Title> 
    <DueDate>01-02-2008</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 2</Title> 
    <DueDate>01-02-2009</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 3</Title> 
    <DueDate>01-02-2010</DueDate> 
    </Item> 
    <Item> 
    <Title>Title 4</Title> 
    <DueDate>01-02-2011</DueDate> 
    </Item> 
</Items> 
1

は、あなたのケースでは、nが3であるため、各標準XSL内でこれを入れ子にしてみてください。

<xsl:if test="position() &lt; n"> 

しかし、あなたはまた、日付を確認したい場合は、あなたがあれば巣別のものを必要とし、日付を作成します。フォーマットyyyyMMddこれは数値のようにこのように比較することができます:

<xsl:variable name="secondDate" select="concat(substring(submissionDeadline, 1,4),substring(submissionDeadline, 6,2),substring(submissionDeadline, 9,2))"/> 

<xsl:if test="$firstDate &gt; $secondDate"> 
4

これは何かできます。あなたは偶然にして呼び出すことができますテンプレートにそれを行います。

<xsl:template match="/"> 
<xsl:variable name="count" select="3"/> 

<xsl:for-each select="Items/Item"> 
    <xsl:if test="position() &lt; $count"> 
     <xsl:value-of select="Title"/> - <xsl:value-of select="DueDate"/> 
    </xsl:if> 
</xsl:for-each> 

+0

しかし、「DueDate」は今日よりも大きい場合、この項目を削除しないのだろうか?それは私に最初の3つの要素を与えるだけです! if文を使って日付をチェックすると、thrid(position()== 3)の "valid"要素だけが表示されます。 –

関連する問題