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