2016-11-06 3 views
3

私はXMLで本のリストを作った。以下は私のXMLファイルのフォーマットです。もちろん、より多くのブロックがあります。<book>XSLでは、for-eachブロックの最初の行だけをどのように印刷できますか?

<data> 
    <book> 
     <title>Encyclopaedia Britannica</title> 
     <category>encyclopedia</category> 
     <language>English</language> 
     <author>Encyclopaedia Britannica Editorial</author> 
     <year>1768</year> 
     <price>49.99</price> 
    </book> 
</data> 

そして、私は最も高価なもののタイトルを印刷したいと思います。

<p style = "display: block;"> 
    The most expensive book is " 
    <xsl:for-each select="data/book"> 
     <xsl:sort select="price" order="descending"/> 
     <!-- <xsl:value-of select="title"/> --> 
    </xsl:for-each> 
     <xsl:value-of select="data/book/title"/> 
    " 
</p> 

(私はコメントとして設定)<xsl:for-each><xsl:value-of>ブロックが実行されると、それは降順にソートすべての書籍を印刷します:.xslファイルに次のように私が試してみました。もちろん、<xsl:value-of select="data/book/title"/>は元のテーブルの最初の本を印刷します。

他の書籍の印刷を中止して最も高価なものを印刷したいが、テーブルがソートされているときは最初のものを印刷したい。

breakのようなものがないことを知っています。だから、<xsl:if>ブロックを使って、行が最初かどうかをチェックすることを考えました。この考えは可能ですか?あるいは私は別の方法でこれを行うことができますか?

答えて

2

私は行が 最初であるかどうかチェックする<xsl:if>ブロックを使用して思いました。これが同数の場合にのみ最初の最も高価なタイトルを選択することを

<xsl:for-each select="/data/book"> 
    <xsl:sort select="price" data-type="number" order="descending"/> 
    <xsl:if test="position()=1"> 
     <xsl:value-of select="title"/> 
    </xsl:if> 
</xsl:for-each> 

注:

はい、これは正しい考えです。


または私は別の方法でこれを行うことができますか?

どのXSLTプロセッサを使用するかによって異なります。 XSLT 2.0では、max()関数を使用できます。また、いくつかのXSLT 1.0プロセッサは、math:max()math:highest()拡張機能をサポートしています。

+0

私は必要なものを手に入れました。私はXSLプログラミングのノブであり、 'prosition()'は私にとって新しいものです。ありがとう! –

関連する問題