XML/XSLT stylesheet/ancestor

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

ancestor::node index

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>
        <h1>
          <xsl:value-of select="$title" />
        </h1>
        <p>
          The following responsibilies were announced on
          <xsl:value-of select="/orgchart/@date" />
          :
        </p>
        <table border="2" cellpadding="5">
          <tr>
            <th>Name</th>
            <th>Role</th>
            <th>Reporting to</th>
          </tr>
          <xsl:for-each select="//person">
            <tr>
              <td>
                <xsl:value-of select="name" />
              </td>
              <td>
                <xsl:value-of select="title" />
              </td>
              <td>
                <xsl:value-of
                  select="ancestor::person[1]/name" />
              </td>
            </tr>
          </xsl:for-each>
        </table>
        <hr />
      </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>
      <h1>Management Structure</h1>
      <p>
                   The following responsibilies were announced on
                   28 March 2001
                   :
                 
      </p>
      <table border="2" cellpadding="5">
         <tr>
            <th>Name</th>
            <th>Role</th>
            <th>Reporting to</th>
         </tr>
         <tr>
            <td>chart 1</td>
            <td>title1</td>
            <td></td>
         </tr>
         <tr>
            <td>a</td>
            <td>b</td>
            <td>chart 1</td>
         </tr>
         <tr>
            <td>c</td>
            <td>d</td>
            <td>a</td>
         </tr>
         <tr>
            <td>e</td>
            <td>f</td>
            <td>a</td>
         </tr>
         <tr>
            <td>S</td>
            <td>M</td>
            <td>chart 1</td>
         </tr>
         <tr>
            <td>S</td>
            <td>I</td>
            <td>chart 1</td>
         </tr>
      </table>
      <hr>
   </body>
</html>



Get value: $node/ancestor::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>
  <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
      ;



if test="ancestor::chapter"

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">
      <p>
        <font face="arial">
          <xsl:apply-templates />
        </font>
      </p>
    </xsl:if>
    <xsl:if test="ancestor::chapter">
      <p>
        <font face="times">
          <xsl:apply-templates />
        </font>
      </p>
    </xsl:if>
  </xsl:template>
  
</xsl:stylesheet>
Output:

  title 1
  
    chapter 1
    <p><font face="times">line 1</font></p>
    <p><font face="times">line 2</font></p>
  
  
    title 2
    <p><font face="times">line 3</font></p>
    <p><font face="times">line 4</font></p>