XML/XSLT stylesheet/ancestor

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

ancestor::node index

   <source lang="xml">

File: Data.xml <?xml-stylesheet type="text/xsl" href="Transform.xslt"?> <orgchart date="28 March 2001">

 <person>
   <name>chart 1</name>
   <title>title1</title>
   <reports>
     <person>
       <name>a</name>
       <title>b</title>
       <reports>
         <person>
           <name>c</name>
           <title>d</title>
         </person>
         <person>
           <name>e</name>
           <title>f</title>
         </person>
       </reports>
     </person>
     <person>
       <name>S</name>
       <title>M</title>
     </person>
     <person>
       <name>S</name>
       <title>I</title>
     </person>
   </reports>
 </person>

</orgchart>

File: Transform.xslt <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 version="1.0">
 <xsl:param name="title">Management Structure</xsl:param>
 <xsl:output indent="yes" />
 <xsl:template match="/">
   <html>
     <head>
       <title>
         <xsl:value-of select="$title" />
       </title>
     </head>
     <body>

<xsl:value-of select="$title" />

The following responsibilies were announced on <xsl:value-of select="/orgchart/@date" />  :

<xsl:for-each select="//person"> </xsl:for-each>
Name Role Reporting to
               <xsl:value-of select="name" />
               <xsl:value-of select="title" />
               <xsl:value-of
                 select="ancestor::person[1]/name" />

     </body>
   </html>
 </xsl:template>

</xsl:stylesheet> Output: <html>

  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <title>Management Structure</title>
  </head>
  <body>

Management Structure

The following responsibilies were announced on 28 March 2001  :

Name Role Reporting to
chart 1 title1
a b chart 1
c d a
e f a
S M chart 1
S I chart 1

  </body>

</html>

</source>
   
  


Get value: $node/ancestor::node()

   <source lang="xml">

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>
 <employee eid="2" dept="training">
   <contact addInfo="info2">
     <name>
       <firstName>S</firstName>
       <middleName int="S">S</middleName>
       <lastName>W</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 <?xml version="1.0"?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 version="2.0">
 <xsl:output method="text" />
 <xsl:template match="/">
   <xsl:for-each select="//*">
     <xsl:value-of select="concat(name(), " -- ")" />
     <xsl:call-template name="depth" />
     ;
   </xsl:for-each>
 </xsl:template>
 <xsl:template name="depth">
   <xsl:param name="node" as="node()" select="." />
   <xsl:value-of select="count($node/ancestor::node())" />
 </xsl:template>

</xsl:transform> Output: employees -- 1

     ;
   title -- 2
     ;
   employee -- 2
     ;
   contact -- 3
     ;
   name -- 4
     ;
   firstName -- 5
     ;
   middleName -- 5
     ;
   lastName -- 5
     ;
   address -- 4
     ;
   street -- 5
     ;
   city -- 5
     ;
   state -- 5
     ;
   zipcode -- 5
     ;
   phone -- 4
     ;
   tel -- 5
     ;
   tel -- 5
     ;
   fax -- 5
     ;
   email -- 4
     ;
   hireDate -- 3
     ;
   employee -- 2
     ;
   contact -- 3
     ;
   name -- 4
     ;
   firstName -- 5
     ;
   middleName -- 5
     ;
   lastName -- 5
     ;
   address -- 4
     ;
   street -- 5
     ;
   city -- 5
     ;
   state -- 5
     ;
   zipcode -- 5
     ;
   phone -- 4
     ;
   tel -- 5
     ;
   tel -- 5
     ;
   fax -- 5
     ;
   email -- 4
     ;
   hireDate -- 3
     ;
   
</source>
   
  


if test="ancestor::chapter"

   <source lang="xml">

File: Data.xml <book>

 <title>title 1</title>
 <chapter>
   <title>chapter 1</title>
   <para>line 1</para>
   <para>line 2</para>
 </chapter>
 <chapter>
   <title>title 2</title>
   <para>line 3</para>
   <para>line 4</para>
 </chapter>

</book> 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="para">
   <xsl:if test="ancestor::appendix">

<xsl:apply-templates />

   </xsl:if>
   <xsl:if test="ancestor::chapter">

<xsl:apply-templates />

   </xsl:if>
 </xsl:template>
 

</xsl:stylesheet> Output:

 title 1
 
   chapter 1

line 1

line 2


   title 2

line 3

line 4

</source>