[http://creativecommons.org/licenses/by/3.0/]
This work is licensed under a CC
Attribution 3.0 Unported License [http://creativecommons.org/licenses/by/3.0/]
Hello Worldin XSLT
Because XML can be used to represent any vocabulary (often defined by some schema),
the question is how these different vocabularies can be processed and maybe transformed
into something else. This something else
may be another XML vocabulary (a common requirement in B2B scenarios), or it may
be HTML (a common scenario for Web publishing). Using XSL Transformations (XSLT), mapping tasks can be implemented easily. XSLT leverages XPath's expressive power
in a rather simple programming language, the programs are often called stylesheets. For easy tasks, XSLT mappings can be specified without much real programming
going on, by simply specifying how components of the source markup are mapped to
components of the target markup.
<xsl:for-each select=".//a"> <xsl:if test="not(@title)"> <xsl:text>This link has no title!</xsl:text> </xsl:if> </xsl:for-each> <xsl:for-each select=".//a[not(@title)]"> <xsl:text>This link has no title!</xsl:text> </xsl:for-each>
default behaviormay seem strange
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet>
textof the document is produced
<xsl:output method="html"/> <xsl:template match="/"> <html> <head> <title>Address List</title> </head> <body> <table> <xsl:for-each select="/people/entry"> <tr> <td><xsl:value-of select="name/given[1]"/></td> <td><xsl:value-of select="name/sur"/></td> <td><a href="mailto:{email}"><xsl:value-of select="email"/></a></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template>
spaghetti code
Hello Worldin XSLT
hello worldtherefore ignores the input
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:text>Hello World!</xsl:text> </xsl:template> </xsl:stylesheet>
<xsl:for-each select="/people/entry"> <tr> <td><xsl:value-of select="name/given[1]"/></td> <td><xsl:value-of select="name/sur"/></td> <td><a href="mailto:{email}"><xsl:value-of select="email"/></a></td> </tr> </xsl:for-each>
<table> <xsl:for-each select="/people/entry"> <tr> <td><xsl:value-of select="name/given[1]"/></td> <td><xsl:value-of select="name/sur"/></td> <td> <xsl:if test="email"> <a href="mailto:{email}"><xsl:value-of select="email"/></a> </xsl:if> </td> </tr> </xsl:for-each> </table>
<td> <xsl:for-each select="phone"> <xsl:text>☎ (</xsl:text> <xsl:choose> <xsl:when test="@location = 'office'">Office</xsl:when> <xsl:when test="@location = 'home'">Home</xsl:when> </xsl:choose> <xsl:text> </xsl:text> <xsl:choose> <xsl:when test="@type = 'voice'">phone</xsl:when> <xsl:when test="@type = 'fax'">fax</xsl:when> </xsl:choose> <xsl:text>): </xsl:text> <xsl:value-of select="."/> <xsl:if test="position() ne last()"> <br/> </xsl:if> </xsl:for-each> </td>
applied)
<html> <head> <title>Address List</title> </head> <body> <table> <xsl:for-each select="/people/entry"> <tr> <td><xsl:value-of select="name/given[1]"/></td> <td><xsl:value-of select="name/sur"/></td> <td><a href="mailto:{email}"><xsl:value-of select="email"/></a></td>
*
matches any element
tr
matches tr elements
thead/tr
matches tr elements within thead elements
p[@class='warning']
matches p elements with their class set to warning
|
)
<ul> <xsl:for-each select="/people/entry"> <li> <xsl:value-of select="concat(name/given[1], ' ', name/sur, ': ')"/> <xsl:apply-templates select="*[local-name() != 'name']"/> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> <xsl:template match="email"> <a href="mailto:{.}" title="{.}">✉</a> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="phone"> <a href="tel:{.}" title="{@location}/{@type}:{.}">☎</a> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="affiliation"/>