XML Tutorial/XSLT stylesheet/Sort — различия между версиями

Материал из Web эксперт
Перейти к: навигация, поиск
 
м (1 версия)
 
(нет различий)

Текущая версия на 11:27, 26 мая 2010

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:apply-templates select="//name"> <xsl:sort order="descending" select="."/> </xsl:apply-templates>
   </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"?><TR><td>Josua</TH></TR><TR><td>John</TH></TR><TR><td>George</TH></TR><TR><td>Charles</TH></TR><TR><td>Alice</TH></TR></TABLE></source>


Sort in a for-each loop

   <source lang="xml">

File: Data.xml <?xml version="1.0"?> <numberlist>

 <number>127</number>
 <number>23</number>
 <number>10</number>

</numberlist> 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" indent="no"/>
 <xsl:strip-space elements="*"/>
 <xsl:variable name="newline">
 <xsl:text></xsl:text>
 </xsl:variable>
 <xsl:template match="/">
   <xsl:for-each select="numberlist/number">
     <xsl:sort select="." data-type="number"/>
     <xsl:value-of select="."/>
     <xsl:value-of select="$newline"/>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet> Output: 1023127</source>


sort order="descending"

   <source lang="xml">

File: Data.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="Transform.xslt" type="text/xsl"?> <europe>

 <state>Belgium</state>
 <state>Germany</state>
 <state>Finland</state>
 <state>Greece</state>
 <state>Ireland</state>
 <state>Luxembourg</state>
 <state>Switzerland</state>

</europe> 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="europe">
   <xsl:apply-templates select="state">
     <xsl:sort order="descending" />
   </xsl:apply-templates>
   <xsl:text>Number of European States: </xsl:text>
   <xsl:value-of select="count(state)" />
   <xsl:text>
</xsl:text>
 </xsl:template>
 <xsl:template match="state">
   <xsl:text> - </xsl:text>
   <xsl:apply-templates />
   <xsl:text>
</xsl:text>
 </xsl:template>

</xsl:stylesheet> Output:

- Switzerland
- Luxembourg
- Ireland
- Greece
- Germany
- Finland
- Belgium

Number of European States: 7</source>


sort order="descending" select="."

   <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="/">
Martha</TH>
<xsl:for-each select="//name"> <xsl:sort order="descending" select="."/> </xsl:for-each> </TABLE> </xsl:template> </xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?>
             <xsl:value-of select="."/>
           </TH>
<TR><td>Josua</TH></TR><TR><td>John</TH></TR><TR><td>George</TH></TR><TR><td>Charles</TH></TR><TR><td>Alice</TH></TR></TABLE></source>


sort select="."

   <source lang="xml">

File: Data.xml

<?xml version="1.0"?> <numberlist>

 <number>127</number>
 <number>23</number>
 <number>10</number>

</numberlist> 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="numberlist/number">
     <xsl:sort select="."/>
     <xsl:value-of select="."/>
     <xsl:text>
</xsl:text>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet> Output: 10 127 23</source>


sort select="." data-type="number"

   <source lang="xml">

File: Data.xml <?xml version="1.0"?> <numberlist>

 <number>127</number>
 <number>23</number>
 <number>10</number>

</numberlist>

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="numberlist/number">
     <xsl:sort select="." data-type="number"/>
     <xsl:value-of select="."/>
     <xsl:text>
</xsl:text>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet> Output: 10 23 127</source>


sort select="xs:integer(.)"

   <source lang="xml">

File: Data.xml <?xml version="1.0"?> <numberlist>

 <number>127</number>
 <number>23</number>
 <number>10</number>

</numberlist> File: Transform.xslt

<?xml version="1.0"?> <xsl:stylesheet version="2.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>
 <xsl:template match="/">
   <xsl:for-each select="numberlist/number">
     <xsl:sort select="xs:integer(.)"/>
     <xsl:value-of select="."/>
     <xsl:text>
</xsl:text>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet> Output: 10 23 127</source>


The <xsl:sort> Element is used to specify sort order for node-sets

   <source lang="xml">

The xsl:sort element can be used together with the xsl:apply-templates element and the xsl:for-each element. 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="/">
Martha</TH>
<xsl:for-each select="//name"> <xsl:sort order="ascending" select="."/> </xsl:for-each> </TABLE> </xsl:template> </xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?>
             <xsl:value-of select="."/>
           </TH>
<TR><td>Charles</TH></TR><TR><td>George</TH></TR><TR><td>John</TH></TR><TR><td>Josua</TH></TR><TR><td>Martha</TH></TR></TABLE></source>
Alice</TH>