XML/XSLT stylesheet/descendant or self

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

descendant-or-self demo

   <source lang="xml">

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>

</source>
   
  


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

   <source lang="xml">

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>
<xsl:apply-templates select="employees/employee" />
Number Last Name First Name Email
        </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>
Number Last Name First Name Email
1 S J a@a.ru
  </body>

</html>

</source>