XML/XSLT stylesheet/last
last() as index
File: Data.xml
<wine grape="Chardonnay">
<winery>shop 1</winery>
<product>product 1</product>
<year>1998</year>
<desc>description</desc>
<prices>
<list>6.99</list>
<discounted>5.99</discounted>
<case>71.50</case>
</prices>
</wine>
File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="no" />
<xsl:template match="item[3]">
~~~~ Start of item element"s template ~~~~ 1. This node: {
<xsl:apply-templates />
} 2. First node: {
<xsl:value-of select="../item[1]" />
} 3. Last node: {
<xsl:value-of select="../item[last()]" />
} 4. Preceding node: {
<xsl:value-of select="preceding-sibling::item[1]" />
} 5. Next node: {
<xsl:value-of select="following-sibling::item[1]" />
} 6. flavor attribute value of first node: {
<xsl:value-of select="../item[1]/@flavor" />
} ~~~~ End of item element"s template ~~~~
</xsl:template>
<xsl:template match="item" />
</xsl:stylesheet>
Output:
shop 1
product 1
1998
description
6.99
5.99
71.50
Output a comma if it"s not the last one in the node
File: Data.xml
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="no" />
<xsl:template match="figure/title">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="para" />
</xsl:stylesheet>
File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:template match="title">
<xsl:text>title ancestors:</xsl:text>
<xsl:for-each select="ancestor::*">
<xsl:value-of select="name()" />
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="para" />
</xsl:stylesheet>
use last() function to get the context size
File: Data.xml
<?xml version="1.0" encoding="utf-8"?>
<Book>
<Chapter number="c1">the first chapter</Chapter>
<Chapter number="c2">the second chapter</Chapter>
<Chapter number="c3">the third chapter</Chapter>
<Chapter number="c4">the fourth chapter</Chapter>
<Chapter number="c5">the fifth chapter</Chapter>
</Book>
File: Transform.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<html>
<head>
<title>context position and context size.</title>
</head>
<body>
<xsl:apply-templates select="/Book/Chapter" />
</body>
</html>
</xsl:template>
<xsl:template match="Chapter">
<xsl:if test="position()=2">
<paragraph>
and the context size is <xsl:value-of select="last()" />.
</paragraph>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Output:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>context position and context size.</title>
</head>
<body>
<paragraph>
and the context size is 5.
</paragraph>
</body>
</html>