XML Tutorial/XPath/descendant

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

descendant axis selects the child nodes of the context node, the child nodes of those child nodes, and so on.

   <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>
Axis: descendant
Element Node-set
   </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="descendant::*">
           <xsl:value-of select="./@id"/>
           <xsl:text/>
         </xsl:for-each>
       </td>
     </tr>
   </xsl:template>

</xsl:stylesheet> Output:

<?xml version="1.0" encoding="UTF-8"?></table></source>


lists all children of each element in the source

   <source lang="xml">

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

   <AAA>
     <BBB id="b1">
       <CCC name="q" size="12"/>
       <EEE id="e1">
         <SSS/>
       </EEE>
       <CCC weight="45"/>
       <CCC/>
     </BBB>
   </AAA>
   <AAA>
     <EEE id="e2"/>
     <CCC>
       <DDD/>
       <DDD/>
     </CCC>
   </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="/descendant::*">
       <xsl:variable name="pos" select="position()"/>
       <xsl:variable name="name" select="name()"/>
       <xsl:if test="not(/descendant::*[position() < $pos and name()= $name])">
         <Paragraph>
           <xsl:value-of select="$name"/>
           <xsl:text> [</xsl:text>
           <xsl:for-each select="//*[name()=$name]/*">
             <xsl:variable name="p" select="position()"/>
             <xsl:if test="not(//*[name()=$name]/*[position()< $p and name()=name(current())])">
               <xsl:value-of select="name()"/>
               <xsl:text>, </xsl:text>
             </xsl:if>
           </xsl:for-each>
           <xsl:text>]</xsl:text>
         </Paragraph>
       </xsl:if>
     </xsl:for-each>
   </xsl:template>

</xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?><Paragraph>data [AAA, ]</Paragraph><Paragraph>AAA [BBB, ]</Paragraph><Paragraph>BBB [CCC, EEE, ]</Paragraph><Paragraph>CCC [DDD, ]</Paragraph><Paragraph>EEE [SSS, ]</Paragraph><Paragraph>SSS []</Paragraph><Paragraph>DDD []</Paragraph></source>

Axis: descendant
Element</th><td>Node-set</th>