XML/XSLT stylesheet/last

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

last() as index

File: Data.xml

<wine grape="Chardonnay">
  <winery>shop 1</winery>
  <product>product 1</product>
  <year>1998</year>
  <desc>description</desc>
  <prices>
    <list>6.99</list>
    <discounted>5.99</discounted>
    <case>71.50</case>
  </prices>
</wine>
File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="no" />
  
  <xsl:template match="item[3]">
    ~~~~ Start of item element"s template ~~~~ 1. This node: {
    <xsl:apply-templates />
    } 2. First node: {
    <xsl:value-of select="../item[1]" />
    } 3. Last node: {
    <xsl:value-of select="../item[last()]" />
    } 4. Preceding node: {
    <xsl:value-of select="preceding-sibling::item[1]" />
    } 5. Next node: {
    <xsl:value-of select="following-sibling::item[1]" />
    } 6. flavor attribute value of first node: {
    <xsl:value-of select="../item[1]/@flavor" />
    } ~~~~ End of item element"s template ~~~~
  </xsl:template>
  <xsl:template match="item" />
</xsl:stylesheet>
Output:

  shop 1
  product 1
  1998
  description
  
    6.99
    5.99
    71.50



Output a comma if it"s not the last one in the node

File: Data.xml

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="no" />
  <xsl:template match="figure/title">
    <xsl:apply-templates />
  </xsl:template>
  <xsl:template match="para" />
</xsl:stylesheet>
File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes" />
  <xsl:template match="title">
    <xsl:text>title ancestors:</xsl:text>
    <xsl:for-each select="ancestor::*">
      <xsl:value-of select="name()" />
      <xsl:if test="position() != last()">
        <xsl:text>,</xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="para" />
  
</xsl:stylesheet>



use last() function to get the context size

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="/">
    <html>
      <head>
        <title>context position and context size.</title>
      </head>
      <body>
        <xsl:apply-templates select="/Book/Chapter" />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="Chapter">
    <xsl:if test="position()=2">
      <paragraph>
        and the context size is <xsl:value-of select="last()" />.
      </paragraph>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>context position and context size.</title>
   </head>
   <body>
      <paragraph>
         and the context size is 5.
         
      </paragraph>
   </body>
</html>