XML/XSLT stylesheet/count

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

count element with certain attribute name

File: Data.xml
<employees>
  <employee hireDate="04/23/1999" officer="yes">
    <last>A</last>
    <first>B</first>
    <salary>1000</salary>
  </employee>
  <employee hireDate="09/01/1998" officer="no">
    <last>C</last>
    <first>D</first>
    <salary>95000</salary>
  </employee>
  <employee hireDate="08/20/2000">
    <last>E</last>
    <first>F</first>
    <salary>8900</salary>
  </employee>
</employees>
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="employees">
    A. Number of employees:
    <xsl:value-of select="count(employee)" />
    B. Number of officers:
    <xsl:value-of select="count(employee[@officer="yes"])" />
    C. Number of employees without "officer" attribute set:
    <xsl:value-of select="count(employee[not(@officer)])" />
    D. Number of comments in "employees" element:
    <xsl:value-of select="count(//comment())" />
  </xsl:template>
  <xsl:template match="employee" />
  
</xsl:stylesheet>
Output:

    A. Number of employees:
    3
    B. Number of officers:
    1
    C. Number of employees without "officer" attribute set:
    1
    D. Number of comments in "employees" element:
    0



Count node

File: Data.xml
<?xml version="1.0" encoding="utf-8"?>
<People>
  <Person>
    <Name>name 1</Name>
    <Description>description 1</Description>
  </Person>
  <Person>
    <Name>name 2</Name>
    <Description>description 2</Description>
  </Person>
</People>

File: Transform.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:template match="/">
    <html>
      <head>
        <title>
          About
          <xsl:value-of select="count(/People/Person)" />
          .
        </title>
      </head>
      <body>
        <h3>
          about
          <xsl:value-of select="count(/People/Person)" />
          people.
        </h3>
        <br />
        <xsl:apply-templates select="/People/Person" />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="Person">
    <h3>
      <xsl:value-of select="Name" />
    </h3>
    <p>
      <xsl:value-of select="Description" />
    </p>
    <br />
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>
                   About
                   2
                   .
                 
      </title>
   </head>
   <body>
      <h3>
                   about
                   2
                   people.
                 
      </h3><br><h3>name 1</h3>
      <p>description 1</p><br><h3>name 2</h3>
      <p>description 2</p><br></body>
</html>



Count tokens

File: Data.xml
<?xml version="1.0"?>
<Employees>
  <Person>
     this is a test
  </Person>
</Employees>
File: Transform.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h3>String handling</h3>
        <xsl:variable name="sentence" select=""this is a test"" />
        The sentence: "
        <xsl:value-of select="$sentence" />
        " has
        <xsl:value-of
          select="count(tokenize($sentence, "\s+"))" />
        words.
        <br />
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <body>
      <h3>String handling</h3>
              The sentence: "
              this is a test
              " has
              4
              words.
              <br></body>
</html>