XML Tutorial/XSLT stylesheet/Sort
Содержание
- 1 sort by attribute: sort select="@joined" data-type="number" order="descending"
- 2 Sort by different data types and order
- 3 Book Inventory
- 4 Book Inventory
- 5 Sort by last name than first name
- 6 sort by name()
- 7 sort data-type="number" order="descending"
- 8 sort elements
- 9 Sort in a for-each loop
- 10 sort order="descending"
- 11 sort order="descending" select="."
- 12 sort select="."
- 13 sort select="." data-type="number"
- 14 sort select="xs:integer(.)"
- 15 The <xsl:sort> Element is used to specify sort order for node-sets
sort by attribute: sort select="@joined" data-type="number" order="descending"
<source lang="xml">
File: Data.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="Transform.xslt" type="text/xsl"?> <member>
<state joined="1995">Austria</state> <state joined="1950">Belgium</state> <state joined="1973">Denmark</state> <state joined="1986">Portugal</state> <state joined="1986">Spain</state> <state joined="1995">Sweden</state> <state joined="1973">United Kingdom</state>
</member>
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:output method="xml" indent="yes" /> <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" /> <xsl:output doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" /> <xsl:template match="member"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>EU Member States</title> <style type="text/css"> h3 {font-size: 16pt} body {font-size: 13pt} </style> </head> <body>
EU Member States
<paragraph> There are <xsl:text> </xsl:text> <xsl:value-of select="count(state)" /> member states, listed starting from the most recent year: </paragraph>
-
<xsl:apply-templates select="state">
<xsl:sort select="@joined" data-type="number"
order="descending" />
</xsl:apply-templates>
</body> </html> </xsl:template> <xsl:template match="state"> <xsl:element name="li" namespace="http://www.w3.org/1999/xhtml"> <xsl:apply-templates /> <xsl:text> (</xsl:text> <xsl:value-of select="@joined" /> <xsl:text>)</xsl:text> </xsl:element> </xsl:template>
</xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head> <title>EU Member States</title> <style type="text/css"> h3 {font-size: 16pt} body {font-size: 13pt} </style> </head> <body>
EU Member States
<paragraph> There are 7 member states, listed starting from the most recent year: </paragraph>
- Austria (1995)
- Sweden (1995)
- Portugal (1986)
- Spain (1986)
- Denmark (1973)
- United Kingdom (1973)
- Belgium (1950)
</body>
</html></source>
Sort by different data types and order
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="Transform.xslt"?> <BOOK>
<TITLE>Java</TITLE> <AUTHOR> <FIRSTNAME>Jack</FIRSTNAME> <LASTNAME>Smith</LASTNAME> </AUTHOR> <BINDING>hardcover</BINDING> <PAGES>724</PAGES> <PRICE>$9.95</PRICE>
</BOOK> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Book Inventory</TITLE> </HEAD> <BODY>
Book Inventory
Trade Paperback Books
<xsl:apply-templates select="INVENTORY/BOOK[BINDING="trade paperback"]"> <xsl:sort select="AUTHOR/LASTNAME" data-type="text" order="ascending"/> <xsl:sort select="AUTHOR/FIRSTNAME" data-type="text" order="ascending"/> <xsl:sort select="PAGES" data-type="number" order="descending"/> </xsl:apply-templates> </BODY> </HTML> </xsl:template> <xsl:template match="BOOK"> Author: <xsl:value-of select="AUTHOR"/>
Title: <xsl:value-of select="TITLE"/>
Binding type: <xsl:value-of select="BINDING"/>
Number of pages: <xsl:value-of select="PAGES"/>
Price: <xsl:value-of select="PRICE"/><P/> </xsl:template>
</xsl:stylesheet> Output: <HTML>
<HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>Book Inventory</TITLE> </HEAD> <BODY>
Book Inventory
Trade Paperback Books
</BODY>
</HTML></source>
Sort by last name than first name
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <addressbook>
<address> <name> <title>Mr.</title> <first-name>Jack</first-name> <last-name>Smith</last-name> </name> <street>1234 Main Street</street> <city>New York</city> <state>WI</state> <zip>48392</zip> </address>
</addressbook>
File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:for-each select="addressbook/address"> <xsl:sort select="name/last-name"/> <xsl:sort select="name/first-name"/> <xsl:if test="name/title"> <xsl:value-of select="name/title"/> <xsl:text> </xsl:text> </xsl:if> <xsl:value-of select="name/first-name"/> <xsl:text> </xsl:text> <xsl:value-of select="name/last-name"/> <xsl:text> </xsl:text> <xsl:value-of select="street"/> <xsl:text> </xsl:text> <xsl:value-of select="city"/> <xsl:text>, </xsl:text> <xsl:value-of select="state"/> <xsl:text> </xsl:text> <xsl:value-of select="zip"/> <xsl:text> </xsl:text> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template>
</xsl:stylesheet> Output: Mr. Jack Smith 1234 Main Street New York, WI 48392</source>
sort by name()
<source lang="xml">
File: Data.xml <list>
<freezer> <element>peas</element> <element>green beans</element> <element>pot pie</element> <element>ice cream</element> </freezer> <bakery> <element>rolls</element> <element>jelly doughnuts</element> <element>bread</element> </bakery> <produce> <element>bananas</element> <element>kumquats</element> <element>apples</element> </produce>
</list>
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:output method="text" /> <xsl:template match="list"> <xsl:apply-templates select="*"> <xsl:sort select="name()" /> </xsl:apply-templates> </xsl:template> <xsl:template match="*"> <xsl:text>Section: </xsl:text> <xsl:value-of select="name()" /> <xsl:text> </xsl:text> <xsl:apply-templates select="element"> <xsl:sort /> </xsl:apply-templates> </xsl:template> <xsl:template match="element"> <xsl:text> * </xsl:text> <xsl:apply-templates /> <xsl:text> </xsl:text> </xsl:template>
</xsl:stylesheet> Output: Section: bakery
* bread * jelly doughnuts * rolls
Section: freezer
* green beans * ice cream * peas * pot pie
Section: produce
* apples * bananas * kumquats</source>
sort data-type="number" order="descending"
<source lang="xml">
File: Data.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="Transform.xslt" type="text/xsl"?> <member>
<state joined="1995">Austria</state> <state joined="1950">Belgium</state> <state joined="1973">Denmark</state> <state joined="1986">Portugal</state> <state joined="1986">Spain</state> <state joined="1995">Sweden</state> <state joined="1973">United Kingdom</state>
</member>
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:output method="text" /> <xsl:template match="member"> <xsl:text>Number of EU Member States: </xsl:text> <xsl:value-of select="count(state)" /> <xsl:text> </xsl:text> <xsl:apply-templates select="state/@joined"> <xsl:sort data-type="number" order="descending" /> </xsl:apply-templates> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="state/@joined"> <xsl:text> - </xsl:text> <xsl:apply-templates select=".." /> <xsl:text> (</xsl:text> <xsl:value-of select="." /> <xsl:text>) </xsl:text> </xsl:template>
</xsl:stylesheet> Output: Number of EU Member States: 7
- Austria (1995) - Sweden (1995) - Portugal (1986) - Spain (1986) - Denmark (1973) - United Kingdom (1973) - Belgium (1950)</source>
sort elements
<source lang="xml">
File: Data.xml <names>
<name>John</name> <name>Josua</name> <name>Charles</name> <name>Alice</name> <name>Martha</name> <name>George</name>
</names> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">
</xsl:template> <xsl:template match="name"> <TR> <td> <xsl:value-of select="."/> </TH> </TR> </xsl:template>
</xsl:stylesheet> Output:
<?xml version="1.0" encoding="UTF-8"?>Martha</TH> |
<xsl:value-of select="."/> </TH> |
Martha</TH> |
<xsl:value-of select="."/> </TH> |
Alice</TH> |