XML/XSLT stylesheet/descendant or self

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

descendant-or-self demo

File: Data.xml
<chapter author="jm">
  <para>para1</para>
  <para author="ar">para2</para>
  <sect1 author="bd">
    <para>para3</para>
    <para>line 1</para>
    <sect2 author="jm">
      <para>line 2</para>
    </sect2>
  </sect1>
</chapter>
File: Transform.xslt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:template match="chapter">
    <chapter>
      Authors
      <xsl:for-each select="descendant-or-self::*/@author">
        <xsl:value-of select="." />
        <xsl:text/>
      </xsl:for-each>
      <xsl:apply-templates />
    </chapter>
  </xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?><chapter>
      Authors
      jmarbdjm
  para1
  para2
  
    para3
    line 1
    
      line 2
    
  
</chapter>



select="descendant-or-self::*[@dept="programming"]"

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>J</firstName>
        <middleName int="B">B</middleName>
        <lastName>S</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>
  <employee eid="2" dept="training">
    <contact addInfo="info2">
      <name>
        <firstName>Sam</firstName>
        <middleName int="S">Stolte</middleName>
        <lastName>Williams</lastName>
        </name>
      <address>
        <street>1 St.</street>
        <city>Austin</city>
        <state>Texas</state>
        <zipcode>22222</zipcode>
      </address>
      <phone>
        <tel type="wk">512-3467899</tel>
        <tel type="hm">512-4623356</tel>
        <fax>512-3465655</fax>
      </phone>
      <email>s@s.ru</email>
    </contact>
    <hireDate>2000-03-11</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>Last Name</th>
                  <th>First Name</th>
                  <th>Email</th>
               </tr>
               <xsl:apply-templates select="employees/employee" />
            </table>
         </body>
      </html>
   </xsl:template>
   <xsl:template match="employee">
      <tr>
         <xsl:for-each select="descendant-or-self::*[@dept="programming"]">
            <td>
               <xsl:number />
            </td>
            <td>
               <xsl:value-of select="descendant::lastName" />
            </td>
            <td>
               <xsl:value-of select="descendant::firstName" />
            </td>
            <td>
               <xsl:value-of select="descendant::email" />
            </td>
         </xsl:for-each>
      </tr>
   </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>Last Name</th>
            <th>First Name</th>
            <th>Email</th>
         </tr>
         <tr>
            <td>1</td>
            <td>S</td>
            <td>J</td>
            <td>a@a.ru</td>
         </tr>
         <tr></tr>
      </table>
   </body>
</html>