Use boolean operator in if statement
File: Data.xml
<?xml version="1.0"?>
<booklist>
<book category="S">
<title>title 1</title>
<author>author 1</author>
</book>
<book category="FC">
<title>author 1</title>
<author>author 1</author>
</book>
<book category="FC">
<title>title 3</title>
<author>author 1</author>
</book>
<book category="CS">
<title>title 4</title>
<author>author 1</author>
<author>author 2</author>
<author>author 3</author>
<author>author 4</author>
</book>
</booklist>
File: Transform.xslt
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<html>
<body>
<xsl:variable name="all-books" select="//book" />
<xsl:for-each select="$all-books">
<h1>
<xsl:value-of select="title" />
</h1>
<p>
<i>by</i>
<xsl:value-of select="author[1]" />
<xsl:if test="count(author)!=1">
and others
</xsl:if>
</p>
<xsl:variable name="others" select="$all-books[./@category=current()/@category and not(. is current())]" />
<xsl:if test="$others">
<p>Other books in this category:</p>
<ul>
<xsl:for-each select="$others">
<li>
<xsl:value-of select="title" />
</li>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:transform>
Output:
<html>
<body>
<h1>title 1</h1>
<p><i>by</i>author 1
</p>
<h1>author 1</h1>
<p><i>by</i>author 1
</p>
<p>Other books in this category:</p>
<ul>
<li>title 3</li>
</ul>
<h1>title 3</h1>
<p><i>by</i>author 1
</p>
<p>Other books in this category:</p>
<ul>
<li>author 1</li>
</ul>
<h1>title 4</h1>
<p><i>by</i>author 1
and others
</p>
</body>
</html>
Related examples in the same category