XML/XSLT stylesheet/self

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

self::node()

File: Data.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="Transform.xslt" type="text/xsl"?>
<employees xmlns="http://www.domain.ru/namespace/employee">
  <title>Employee Data File</title>
  <employee eid="1" dept="programming">
    <contact addInfo="info1">
      <name>
        <firstName>Joe</firstName>
        <middleName int="B">Brian</middleName>
        <lastName>Smith</lastName>
      </name>
      <address>
        <street>1 Drive</street>
        <city>Vancouver</city>
        <state>BC</state>
        <zipcode>80210</zipcode>
      </address>
      <phone>
        <tel type="wk">111-1111111</tel>
        <tel type="hm">222-222222</tel>
        <fax>303-4667357</fax>
      </phone>
      <email>a@a.ru</email>
    </contact>
    <hireDate>2008-10-29</hireDate>
  </employee>
</employees>

File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="html" indent="yes" />
   <xsl:template match="/">
      <html>
         <head>
            <title>Employee Data Output</title>
         </head>
         <body>
            <xsl:apply-templates select="employees/employee" />
         </body>
      </html>
   </xsl:template>
   <xsl:template match="employee">
      <h1>
         <xsl:value-of select="parent::node()/title" />
      </h1>
      <table>
         <tr>
            <th>Number</th>
            <th>Email</th>
         </tr>
         <tr>
            <xsl:for-each select="self::node()">
               <td>
                  <xsl:number />
               </td>
               <td>
                  <xsl:value-of select="contact/email" />
               </td>
            </xsl:for-each>
         </tr>
      </table>
   </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Employee Data Output</title>
   </head>
   <body></body>
</html>



test="self::para[@fontsize="agate"]"

File: Data.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Transform.xslt"?>
<advertisement action="create">
    asdf
</advertisement>
File: Transform.xslt
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="text" indent="no" />
  <xsl:variable select="advertisement/text" name="path" />
  <xsl:template match="/">
    <xsl:apply-templates select="$path" />
  </xsl:template>
  <xsl:template match="text">
    <xsl:apply-templates />
  </xsl:template>
  <xsl:template match="headline">
    <xsl:text>\F4</xsl:text>
    <xsl:value-of select="text()" />
  </xsl:template>
  <xsl:template match="para">
    <xsl:if test="self::para[@fontsize="agate"]">
      <xsl:text>&#13;\F1</xsl:text>
      <xsl:value-of select="text()" />
    </xsl:if>
    <xsl:if test="self::para[@justify="flushleft"]">
      <xsl:text>&lt;</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>



value-of select="self::node()"

File: Data.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="Transform.xslt" type="text/xsl"?>
<employees>
  <head:header xmlns:head="http://www.domain.ru/namespace/header">
    <title>Employee Data File</title>
    <maintainer>developer 1</maintainer>
  </head:header>
  <employee eid="1" dept="programming">
    <contact addInfo="info1">
      <name>
        <firstName>Joe</firstName>
        <middleName int="B">Brian</middleName>
        <lastName>Smith</lastName>
      </name>
      <address>
        <street>1 Drive</street>
        <city>Vancouver</city>
        <state>BC</state>
        <zipcode>80210</zipcode>
      </address>
      <phone>
        <tel type="wk">111-1111111</tel>
        <tel type="hm">222-222222</tel>
        <fax>303-4667357</fax>
      </phone>
      <email>a@a.ru</email>
    </contact>
    <hireDate>2008-10-29</hireDate>
  </employee>
</employees>
File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="html" indent="yes" />
  <xsl:template match="/">
    <html>
      <head>
        <title>Employee Output</title>
      </head>
      <body>
        <table>
          <tr>
            <th>Number</th>
            <th>Email</th>
          </tr>
          <xsl:apply-templates select="employees/employee" />
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="employee">
    <tr>
      <td>
        <xsl:number />
      </td>
      <xsl:apply-templates select="contact/email" />
    </tr>
  </xsl:template>
  <xsl:template match="contact/email">
    <td>
      <xsl:value-of select="self::node()" />
    </td>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Employee Output</title>
   </head>
   <body>
      <table>
         <tr>
            <th>Number</th>
            <th>Email</th>
         </tr>
         <tr>
            <td>1</td>
            <td>a@a.ru</td>
         </tr>
      </table>
   </body>
</html>