XML/XSLT stylesheet/position
Get the context position with position() function
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="Chapter">
<xsl:if test="position()=2">
<paragraph>
the context position is
<xsl:value-of select="position()" />
</paragraph>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<paragraph>
the context position is
2</paragraph>
If statement and position(), last() functions
File: Data.xml
<?xml version="1.0"?>
<Book>
<Title>this is the title</Title>
<Authors>
<Author>A</Author>
<Author>B</Author>
<Author>C</Author>
</Authors>
<Year>2007</Year>
<Chapters>
<Chapter number="1" title="title 1">chapter 1</Chapter>
<Chapter number="2" title="title 2">chapter 2</Chapter>
<Chapter number="3" title="title 3">chapter 3</Chapter>
<Chapter number="4" title="title 4">chapter 4</Chapter>
<Chapter number="5" title="title 5">chapter 5</Chapter>
</Chapters>
</Book>
File: Transform.xslt
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="Author">
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="position() = last()-1">
<xsl:text>and </xsl:text>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text>.</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
this is the title
A,
B,
C, and
2007
chapter 1
chapter 2
chapter 3
chapter 4
chapter 5
position() function
File: Data.xml
<?xml version="1.0" encoding="UTF-8"?>
<provinces>
<name>Alberta</name>
<name>British Columbia</name>
<name>Manitoba</name>
<name>New Brunswick</name>
<name>Newfoundland and Labrador</name>
<name>Northwest Territories</name>
<name>Nova Scotia</name>
<name>Nunavut</name>
<name>Ontario</name>
<name>Prince Edward Island</name>
<name>Quebec</name>
<name>Saskatchewan</name>
<name>Yukon</name>
</provinces>
File: Transform.xslt
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="provinces">
<xsl:apply-templates select="name" />
</xsl:template>
<xsl:template match="name">
<xsl:value-of select="position()" />
<xsl:text>. </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Output:
1. Alberta
2. British Columbia
3. Manitoba
4. New Brunswick
5. Newfoundland and Labrador
6. Northwest Territories
7. Nova Scotia
8. Nunavut
9. Ontario
10. Prince Edward Island
11. Quebec
12. Saskatchewan
13. Yukon