2016-11-06 11 views
3

Я составил список книг в формате XML. Ниже приведен формат моего XML-файла; есть, конечно, еще несколько блоков <book>.В XSL, как я могу напечатать только первую строку для каждого блока?

<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> 

И я хочу напечатать название самого дорогого. Я попытался следующим образом в файле .xsl:

<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:value-of> Когда блок в <xsl:for-each> (который я поставил в качестве комментария) выполняется он печатает все книги, отсортированные в порядке убывания. Конечно, <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()' для меня новый. Благодаря! –

Смежные вопросы