XML/XSLT stylesheet/template match

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

Call a template with parameter

File: Data.xml 
<?xml version="1.0"?>
<programme>
   <opera>
      <title>A</title>
      <composer>B</composer>
      <date>1791</date>
   </opera>
   <composer name="Mozart">
      <fullname>Mozart</fullname>
      <born>1756</born>
      <died>1791</died>
   </composer>
</programme>
File: Transform.xslt
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:template match="/">
    <xsl:variable name="list">
      <xsl:call-template name="make-list">
        <xsl:with-param name="names"
          select="/programme/composer/fullname" />
      </xsl:call-template>
    </xsl:variable>
    This week"s composers are:
    <xsl:value-of select="translate($list, ",", ";")" />
  </xsl:template>
  <xsl:template name="make-list">
    <xsl:param name="names" />
    <xsl:for-each select="$names">
      <xsl:value-of select="." />
      <xsl:if test="position()!=last()">,</xsl:if>
      <xsl:if test="position()=last()-1">and</xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Output:
<?xml version="1.0" encoding="UTF-8"?>
    This week"s composers are:



Define and use template

File: Data.xml 
<poem>
   <author>author 1</author>
   <date>1912</date>
   <title>Song</title>
  <stanza>
      <line>line 1</line>
      <line>line 2</line>
      <line>line 3</line>
      <line>line 4</line>
   </stanza>
   <stanza>
      <line>line 5</line>
      <line>line 6</line>
      <line>line 7</line>
      <line>line 8</line>
   </stanza>
   <stanza>
      <line>line 9</line>
      <line>line 10</line>
      <line>line 11</line>
      <line>line 12</line>
   </stanza>
</poem>
File: Transform.xslt
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:template match="poem">
    <html>
      <head>
        <title>
          <xsl:value-of select="title" />
        </title>
      </head>
      <body>
        <xsl:apply-templates select="title" />
        <xsl:apply-templates select="author" />
        <xsl:apply-templates select="stanza" />
        <xsl:apply-templates select="date" />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="title">
    <div align="center">
      <h1>
        <xsl:value-of select="." />
      </h1>
    </div>
  </xsl:template>
  <xsl:template match="author">
    <div align="center">
      <h2>
        By
        <xsl:value-of select="." />
      </h2>
    </div>
  </xsl:template>
  <xsl:template match="date">
    <p>
      <i>
        <xsl:value-of select="." />
      </i>
    </p>
  </xsl:template>
  <xsl:template match="stanza">
    <p>
      <xsl:apply-templates select="line" />
    </p>
  </xsl:template>
  <xsl:template match="line">
    <xsl:if test="position() mod 2 = 0">&#160;&#160;</xsl:if>
    <xsl:value-of select="." />
    <br />
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Song</title>
   </head>
   <body>
      <div align="center">
         <h1>Song</h1>
      </div>
      <div align="center">
         <h2>
                    By
                    author 1
         </h2>
      </div>
      <p>line 1<br>&nbsp;&nbsp;line 2<br>line 3<br>&nbsp;&nbsp;line 4<br></p>
      <p>line 5<br>&nbsp;&nbsp;line 6<br>line 7<br>&nbsp;&nbsp;line 8<br></p>
      <p>line 9<br>&nbsp;&nbsp;line 10<br>line 11<br>&nbsp;&nbsp;line 12<br></p>
      <p><i>1912</i></p>
   </body>
</html>



Get two values in one template

File: Data.xml
<?xml version="1.0"?>
<people>
  <person born="1912" died="1954">
    <name>
      <first_name>A</first_name>
      <last_name>B</last_name>
    </name>
    <profession>C</profession>
    <profession>D</profession>
    <profession>E</profession>
  </person>
  <person born="2008" died="2008">
    <name>
      <first_name>F</first_name>
      <middle_initial>G</middle_initial>
      <last_name>H</last_name>
    </name>
    <profession>I</profession>
    <hobby>J</hobby>
  </person>
</people>

File: Transform.xslt
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="people">
    <html>
      <head><title>Famous Scientists</title></head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="name">
    <p><xsl:value-of select="last_name"/>, 
    <xsl:value-of select="first_name"/></p>
  </xsl:template>
  <xsl:template match="person">
    <xsl:apply-templates select="name"/>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Famous Scientists</title>
   </head>
   <body>
      
      
      <p>B, 
         A
      </p>
      
      
      <p>H, 
         F
      </p>
      
      
   </body>
</html>



Locate parent tags and get value from children tags

File: Data.xml

<?xml version="1.0"?>
<emailList>
  <person>
    <name>name 1</name>
    <email>g@gmail.ru</email>
  </person>
  <person>
    <name>name 2</name>
    <email>n@hotmail.ru</email>
  </person>
</emailList>

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>Email Listing</title>
      </head>
      <body>
        <table>
          <tr>
            <th>Name</th>
            <th>E-mail Address</th>
          </tr>
          <xsl:apply-templates/>
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="person">
    <tr>
      <td><xsl:value-of select="name"/></td>
      <td><xsl:value-of select="email"/></td>
    </tr>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Email Listing</title>
   </head>
   <body>
      <table>
         <tr>
            <th>Name</th>
            <th>E-mail Address</th>
         </tr>
           
         <tr>
            <td>name 1</td>
            <td>g@gmail.ru</td>
         </tr>
           
         <tr>
            <td>name 2</td>
            <td>n@hotmail.ru</td>
         </tr>
         
      </table>
   </body>
</html>



match and get value operations with namespace

File: Data.xml
<?xml version="1.0"?>
<people>
  <person born="1912" died="1954">
    <name>
      <first_name>A</first_name>
      <last_name>B</last_name>
    </name>
    <profession>C</profession>
    <profession>D</profession>
    <profession>E</profession>
  </person>
  <person born="2008" died="2008">
    <name>
      <first_name>F</first_name>
      <middle_initial>G</middle_initial>
      <last_name>H</last_name>
    </name>
    <profession>I</profession>
    <hobby>J</hobby>
  </person>
</people>

File: Transform.xslt
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:pe="http://www.cafeconleche.org/namespaces/people">
     
  <xsl:template match="pe:people">
    <html>
      <head><title>Famous Scientists</title></head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
     
  <xsl:template match="pe:name">
    <p><xsl:value-of select="pe:last_name"/>,
    <xsl:value-of select="pe:first_name"/></p>
  </xsl:template>
     
  <xsl:template match="pe:person">
    <xsl:apply-templates select="pe:name"/>
  </xsl:template>
     
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
  
    
      A
      B
    
    C
    D
    E
  
  
    
      F
      G
      H
    
    I
    J



match an element

File: Data.xml
<?xml version="1.0"?>
<people>
  <person born="1912" died="1954">
    <name>
      <first_name>A</first_name>
      <last_name>B</last_name>
    </name>
    <profession>C</profession>
    <profession>D</profession>
    <profession>E</profession>
  </person>
  <person born="2008" died="2008">
    <name>
      <first_name>F</first_name>
      <middle_initial>G</middle_initial>
      <last_name>H</last_name>
    </name>
    <profession>I</profession>
    <hobby>J</hobby>
  </person>
</people>

File: Transform.xslt
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="person">A Person</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
  A Person
  A Person



output a table without loop

File: Data.xml
<?xml version="1.0" ?>
<customer-list>
  <customer>
    <name>
      <first>A</first>
      <last>B</last>
    </name>
    <order>C</order>
    <order>D</order>
  </customer>
</customer-list>
File: Transform.xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <HTML>
      <HEAD>
        <TITLE>Customers</TITLE>
      </HEAD>
      <BODY>
        <TABLE BORDER="1" >
          <xsl:apply-templates select="customer-list/customer" />
        </TABLE>
      </BODY>
    </HTML>
  </xsl:template>
  <xsl:template match="customer">
    <TR><TH ALIGN="left">
      <xsl:apply-templates select="name"/>
    </TH></TR>
    <xsl:apply-templates select="order"/>
  </xsl:template>
  <xsl:template match="order">
    <TR><TD>
      <xsl:apply-templates/>
    </TD></TR>
  </xsl:template>
  <xsl:template match="name">
    <xsl:value-of select="last" />, 
    <xsl:value-of select="first" />
  </xsl:template>
</xsl:stylesheet>
Output:
<HTML>
   <HEAD>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <TITLE>Customers</TITLE>
   </HEAD>
   <BODY>
      <TABLE BORDER="1">
         <TR>
            <TH ALIGN="left">B, 
                   A
            </TH>
         </TR>
         <TR>
            <TD>C</TD>
         </TR>
         <TR>
            <TD>D</TD>
         </TR>
      </TABLE>
   </BODY>
</HTML>



output in template

File: Data.xml
<?xml version="1.0"?>
<people>
  <person born="1912" died="1954">
    <name>
      <first_name>A</first_name>
      <last_name>B</last_name>
    </name>
    <profession>C</profession>
    <profession>D</profession>
    <profession>E</profession>
  </person>
  <person born="2008" died="2008">
    <name>
      <first_name>F</first_name>
      <middle_initial>G</middle_initial>
      <last_name>H</last_name>
    </name>
    <profession>I</profession>
    <hobby>J</hobby>
  </person>
</people>

File: Transform.xslt
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="person">
    <p>A Person</p>
  </xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
  <p>A Person</p>
  <p>A Person</p>



Select value from an element with value-of

File: Data.xml
<?xml version="1.0"?>
<people>
  <person born="1912" died="1954">
    <name>
      <first_name>A</first_name>
      <last_name>B</last_name>
    </name>
    <profession>C</profession>
    <profession>D</profession>
    <profession>E</profession>
  </person>
  <person born="2008" died="2008">
    <name>
      <first_name>F</first_name>
      <middle_initial>G</middle_initial>
      <last_name>H</last_name>
    </name>
    <profession>I</profession>
    <hobby>J</hobby>
  </person>
</people>

File: Transform.xslt
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="person">
    <p>
      <xsl:value-of select="name"/>
    </p>
  </xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
  <p>
      A
      B
    </p>
  <p>
      F
      G
      H
    </p>



set match mode to fulltext

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="Chapter" mode="fulltext">
        <h3>
           <xsl:value-of select="@number" />. 
           <xsl:value-of select="@title" />
        </h3>
        <paragraph>
           <xsl:value-of select="." />
        </paragraph>
    </xsl:template>

</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
  this is the title
  
    A
    B
    C
  
  2007
  
    chapter 1
    chapter 2
    chapter 3
    chapter 4
    chapter 5



template mode="index"

File: Data.xml
<?xml version="1.0"?>
<cv>
  <para>
    <performance>
      <publication>H</publication>
      G
      <venue>F</venue>
      E
      <group>D</group>
      C
      <date>1998</date>
      B
      <quote>
        A
      </quote>
    </performance>
  </para>
</cv>

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>
      <body>
        <xsl:apply-templates />
        <table bgcolor="#cccccc" border="1" cellpadding="5">
          <tr>
            <td>
              <b>Date</b>
            </td>
            <td>
              <b>Venue</b>
            </td>
            <td>
              <b>Composer</b>
            </td>
            <td>
              <b>Work</b>
            </td>
            <td>
              <b>Role</b>
            </td>
          </tr>
          <xsl:apply-templates mode="index" />
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="performance" mode="index">
    <tr>
      <td>
        <xsl:value-of select="date" />
        &#xa0;
      </td>
      <td>
        <xsl:value-of select="venue" />
        &#xa0;
      </td>
      <td>
        <xsl:value-of select="composer" />
        &#xa0;
      </td>
      <td>
        <xsl:value-of select="work" />
        &#xa0;
      </td>
      <td>
        <xsl:value-of select="role" />
        &#xa0;
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>
Output:
<html>
   <body>
        
          
            H
            G
            F
            E
            D
            C
            1998
            B
            
              A
            
          
        
      
      <table bgcolor="#cccccc" border="1" cellpadding="5">
         <tr>
            <td><b>Date</b></td>
            <td><b>Venue</b></td>
            <td><b>Composer</b></td>
            <td><b>Work</b></td>
            <td><b>Role</b></td>
         </tr>
           
             
         <tr>
            <td>1998
                       &nbsp;
                     
            </td>
            <td>F
                       &nbsp;
                     
            </td>
            <td>
                       &nbsp;
                     
            </td>
            <td>
                       &nbsp;
                     
            </td>
            <td>
                       &nbsp;
                     
            </td>
         </tr>
           
         
      </table>
   </body>
</html>



template with parameters

File: Data.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<booklist>
   <book>
      <title>title 1</title>
      <author>author 1</author>
      <publisher>publisher 1</publisher>
      <isbn>1-11-11111-1</isbn>
      <price>6.99</price>
      <sales>235</sales>
   </book>
   <book>
      <title>title 2</title>
      <author>author 2</author>
      <publisher>publisher 2</publisher>
      <isbn>0 14 018967 X</isbn>
      <price>12.99</price>
      <sales>12</sales>
   </book>
</booklist>

File: Transform.xslt
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs" version="2.0">
  <xsl:template name="get-min-and-max">
    <xsl:param name="nodes" as="node()*" />
    <xsl:param name="min-so-far" select="number("INF")"
      as="xs:double" />
    <xsl:param name="max-so-far" select="number("-INF")"
      as="xs:double" />
    <xsl:choose>
      <xsl:when test="$nodes">
        <xsl:call-template name="get-min-and-max">
          <xsl:with-param name="nodes"
            select="remove($nodes, 1)" />
          <xsl:with-param name="min-so-far"
            select="if (number($nodes[1]) lt $min-so-far) 
                                  then $nodes[1]
                                  else $min-so-far" />
          <xsl:with-param name="max-so-far"
            select="if (number($nodes[1]) gt $max-so-far) 
                                  then $nodes[1]
                                  else $max-so-far" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:document>
          <min>
            <xsl:value-of select="$min-so-far" />
          </min>
          <max>
            <xsl:value-of select="$max-so-far" />
          </max>
        </xsl:document>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <xsl:template match="/">
    <result>
      <xsl:call-template name="get-min-and-max">
        <xsl:with-param name="nodes"
          select="/booklist/book/price" />
      </xsl:call-template>
    </result>
  </xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?><result><min>6.99</min><max>12.99</max></result>