XML/XSLT stylesheet/preceding sibling

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

preceding-sibling

   <source lang="xml">

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>

Preceding-sibling axis.

       <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>

Preceding-sibling axis.

     <paragraph>FirstName
                which contains the text "
                E
                ".
              
     </paragraph>
     <paragraph>LastName
                which contains the text "
                F
                ".
              
     </paragraph>
  </body>

</html>

</source>
   
  


preceding-sibling and following-sibling

   <source lang="xml">

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>
</source>
   
  


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

   <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>

</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>

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" />

 </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>

</source>