在XSL中,如何只打印for-block中的第一行?

时间:2016-11-06 06:27:37

标签: xml xslt

我用XML制作了一本书籍清单。以下是我的XML文件的格式;当然还有一些<book>块。

<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>块来检查行是否是第一行。这个想法有可能吗?或者我可以用另一种方式做到这一点吗?

1 个答案:

答案 0 :(得分: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()扩展功能。