XML/XSLT stylesheet/preceding sibling

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

preceding-sibling

File: Data.xml
<?xml version="1.0"?>
<Employees>
  <Person>
    <FirstName>A</FirstName>
    <LastName>B</LastName>
    <DateOfBirth>2008-12-12</DateOfBirth>
  </Person>
  <Person>
    <FirstName>C</FirstName>
    <LastName>D</LastName>
    <DateOfBirth>2008-11-11</DateOfBirth>
  </Person>
  <Person>
    <FirstName>E</FirstName>
    <LastName>F</LastName>
    <DateOfBirth>2008-10-10</DateOfBirth>
  </Person>
</Employees>

File: Transform.xslt
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <head>
        <title>preceding-sibling axis.</title>
      </head>
      <body>
        <h3>Preceding-sibling axis.</h3>
        <xsl:apply-templates
          select="/Employees/Person[3]/DateOfBirth" />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="DateOfBirth">
    <xsl:for-each select="preceding-sibling::*">
      <paragraph>
        <xsl:value-of select="name(.)" />
        which contains the text "
        <xsl:value-of select="." />
        ".
      </paragraph>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>preceding-sibling axis.</title>
   </head>
   <body>
      <h3>Preceding-sibling axis.</h3>
      <paragraph>FirstName
                 which contains the text "
                 E
                 ".
               
      </paragraph>
      <paragraph>LastName
                 which contains the text "
                 F
                 ".
               
      </paragraph>
   </body>
</html>



preceding-sibling and following-sibling

File: Data.xml
<story>
  <chapter>
    <title>Chapter 1</title>
    <para>para 1</para>
  </chapter>
  <chapter>
    <title>Chapter 2</title>
    <para>item 1</para>
    <para>item 2</para>
    <sect>
      <title>Chapter 2, Section 1</title>
      <para>item 3</para>
      <para>para 2</para>
    </sect>
  </chapter>
  <chapter>
    <title>Chapter 3</title>
    <para>para A</para>
  </chapter>
</story>
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="chapter">
    <chapter>
      Previous chapter: (
      <xsl:value-of select="preceding-sibling::chapter[1]/title" />
      ) Next chapter: (
      <xsl:value-of select="following-sibling::chapter/title" />
      )
      <xsl:text>
  </xsl:text>
      <xsl:apply-templates />
    </chapter>
  </xsl:template>
  
</xsl:stylesheet>
Output:

  <chapter>
      Previous chapter: (
      
      ) Next chapter: (
      Chapter 2
      )
      
  
    Chapter 1
    para 1
  </chapter>
  <chapter>
      Previous chapter: (
      Chapter 1
      ) Next chapter: (
      Chapter 3
      )
      
  
    Chapter 2
    item 1
    item 2
    
      Chapter 2, Section 1
      item 3
      para 2
    
  </chapter>
  <chapter>
      Previous chapter: (
      Chapter 2
      ) Next chapter: (
      
      )
      
  
    Chapter 3
    para A
  </chapter>



select="preceding-sibling::*[1]/contact/name/firstName"

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 Output</title>
      </head>
      <body>
        <xsl:apply-templates select="employees/employee" />
      </body>
    </html>
  </xsl:template>
  <xsl:template match="employee">
    <xsl:variable name="choose">
      <xsl:choose>
        <xsl:when
          test="preceding-sibling::*/contact/name/firstName">
          <xsl:value-of
            select="preceding-sibling::*[1]/contact/name/firstName" />
        </xsl:when>
        <xsl:otherwise>Nobody</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <p>
      The employee element node that is the preceding sibling of
      <xsl:value-of select="self::*/contact/name/firstName" />
      is for the following staff member:
      <xsl:value-of select="$choose" />
    </p>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Employee Output</title>
   </head>
   <body></body>
</html>