XML Tutorial/XPath/proceding sibling

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

First subject preceding Java is

   <source lang="xml">

File: Data.xml <?xml version = "1.0"?> <product>

  <books>
     <book>
        Getting Started with Microsoft Visual C++ 
     </book>
     <book>Java</book>
  </books>

</product> File: Transform.xslt <?xml version = "1.0"?> <xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/product">
   First subject preceding "Java" is
   <xsl:value-of
     select="//subject[. = "Java"
                 ]/preceding-sibling::subject[ 1 ]" />
 </xsl:template>

</xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?>

   First subject preceding "Java" is</source>
   
  

if test="not(preceding-sibling::address[zip=$lastZip])"

   <source lang="xml">

File: Data.xml <?xml version="1.0"?> <addressbook>

 <address>
   <name>
     <title>Mr.</title>
     <first-name>Jack</first-name>
     <last-name>Smith</last-name>
   </name>
   <street>1234 Main Street</street>
   <city>New York</city>
   <state>WI</state>
   <zip>48392</zip>
 </address>

</addressbook>

File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text" indent="no"/>
 <xsl:template match="/">
   <xsl:for-each select="addressbook/address">
     <xsl:sort select="zip"/>
     <xsl:variable name="lastZip" select="zip"/>
     <xsl:if test="not(preceding-sibling::address[zip=$lastZip])">
       <xsl:text>Zip code </xsl:text>
       <xsl:value-of select="zip"/>
       <xsl:text>: 
</xsl:text>
       <xsl:for-each select="/addressbook/address[zip=$lastZip]">
         <xsl:sort select="name/last-name"/>
         <xsl:sort select="name/first-name"/>
         <xsl:if test="name/title">
           <xsl:value-of select="name/title"/>
           <xsl:text> </xsl:text>
         </xsl:if>
         <xsl:value-of select="name/first-name"/>
         <xsl:text> </xsl:text>
         <xsl:value-of select="name/last-name"/>
         <xsl:text>
</xsl:text>
         <xsl:value-of select="street"/>
         <xsl:text>

</xsl:text>
       </xsl:for-each>
     </xsl:if>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet> Output: Zip code 48392: Mr. Jack Smith 1234 Main Street</source>


if test="position() = 1 or zip!=preceding-sibling::address[1]/zip"

   <source lang="xml">

File: Data.xml <?xml version="1.0"?> <addressbook>

 <address>
   <name>
     <title>Mr.</title>
     <first-name>Jack</first-name>
     <last-name>Smith</last-name>
   </name>
   <street>1234 Main Street</street>
   <city>New York</city>
   <state>WI</state>
   <zip>48392</zip>
 </address>

</addressbook>

File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text" indent="no"/>
 <xsl:template match="/">
   <xsl:for-each select="addressbook/address">
     <xsl:sort select="zip"/>
     <xsl:if test="position() = 1 or zip!=preceding-sibling::address[1]/zip">
       <xsl:text>
Zip code </xsl:text>
       <xsl:value-of select="zip"/>
       <xsl:text> (</xsl:text>
       <xsl:value-of select="city"/>
       <xsl:text>, </xsl:text>
       <xsl:value-of select="state"/>
       <xsl:text>): 
</xsl:text>
     </xsl:if>
     <xsl:if test="name/title">
       <xsl:value-of select="name/title"/>
       <xsl:text> </xsl:text>
     </xsl:if>
     <xsl:value-of select="name/first-name"/>
     <xsl:text> </xsl:text>
     <xsl:value-of select="name/last-name"/>
     <xsl:text>
</xsl:text>
     <xsl:value-of select="street"/>
     <xsl:text>

</xsl:text>
   </xsl:for-each>
 </xsl:template>

</xsl:stylesheet> Output:

Zip code 48392 (New York, WI): Mr. Jack Smith 1234 Main Street</source>


preceding-sibling axis includes those nodes that are in the preceding axis and that also share a parent node with the context node.

   <source lang="xml">

File: Data.xml <?xml version="1.0" encoding="utf-8"?>

   <AAA id="a1" pos="start">
     <BBB id="b1"/>
     <BBB id="b2"/>
   </AAA>
   <AAA id="a2">
     <BBB id="b3"/>
     <BBB id="b4"/>
     <CCC id="c1">
       <CCC id="c2"/>
     </CCC>
     <BBB id="b5">
       <CCC id="c3"/>
     </BBB>
   </AAA>

File: Transform.xslt <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet

     version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
<xsl:for-each select="/source//*"> <xsl:call-template name="print"/> </xsl:for-each> </table> </xsl:template> <xsl:template name="print"> <tr> <td> <xsl:value-of select="name()"/> <xsl:text> id = </xsl:text> <xsl:value-of select="./@id"/> </td> <td> <xsl:for-each select="preceding-sibling::*"> <xsl:if test="not(@id)"> <xsl:value-of select="name()"/> </xsl:if> <xsl:value-of select="./@id"/> <xsl:text/> </xsl:for-each> </td> </tr> </xsl:template> </xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?>
Axis: preceding-sibling
Element</th>
         <td>Node-set</th>
</table></source>
Axis: preceding-sibling
Element</th><td>Node-set</th>