Nic Miloslav     Example 78    KEYWORDS      EXAMPLES      AUTHORS     

Stylesheet 1 and Stylesheet 2 count elements which occured in XML source. Stylesheet 3 lists all children of each element in the source.


     XML     HOME     XSL 1     XSL 2     XSL 3     XSL 4      
<xslTutorial >
<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>
</xslTutorial>

     XSL 1     HOME     XML     HTML 1     OUTPUT 1     
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<TABLE border='1' width="90%">
<TR><TH>Element</TH><TH>Occurs</TH></TR>
<xsl:for-each select="/descendant::*">
<xsl:variable name="pos" select="position()"/>
<xsl:if test="not(/descendant::*[position() &lt; $pos and name()=name(current())])">
<TR><TD><xsl:value-of select="name()"/></TD><TD>
<xsl:value-of select="count(/descendant::*[name()=name(current())])"/>
</TD></TR>
</xsl:if>
</xsl:for-each>
<TR><TH>Total count</TH><TH><xsl:value-of select="count(//*)"/></TH></TR>
</TABLE>
</xsl:template>
</xsl:stylesheet>

     HTML 1     HOME     XML     XSL 1     OUTPUT 1     
<TABLE border="1" width="90%">
<TR>
<TH>Element</TH>
<TH>Occurs</TH></TR>
<TR>
<TD>xslTutorial</TD>
<TD>1</TD></TR>
<TR>
<TD>AAA</TD>
<TD>2</TD></TR>
<TR>
<TD>BBB</TD>
<TD>1</TD></TR>
<TR>
<TD>CCC</TD>
<TD>4</TD></TR>
<TR>
<TD>EEE</TD>
<TD>2</TD></TR>
<TR>
<TD>SSS</TD>
<TD>1</TD></TR>
<TR>
<TD>DDD</TD>
<TD>2</TD></TR>
<TR>
<TH>Total count</TH>
<TH>13</TH></TR></TABLE>

     OUTPUT 1     HOME     XML     XSL 1     HTML 1     
ElementOccurs
xslTutorial1
AAA2
BBB1
CCC4
EEE2
SSS1
DDD2
Total count13

     XSL 2     HOME     XML     HTML 2     OUTPUT 2     
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<TABLE border='1' width="90%">
<xsl:apply-templates select="//*"/>
<TR><TH>Total count</TH><TH><xsl:value-of select="count(//*)"/></TH></TR>
</TABLE>
</xsl:template>
<xsl:template match="*">
<xsl:if test="not(descendant::*[name()=name(current())] | following::*[name()=name(current())])">
<TR><TD><xsl:value-of select="name()"/></TD>
<TD><xsl:value-of select="count(/descendant::*[name()=name(current())])"/></TD>
</TR>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

     HTML 2     HOME     XML     XSL 2     OUTPUT 2     
<TABLE border="1" width="90%">
<TR>
<TD>xslTutorial</TD>
<TD>1</TD></TR>
<TR>
<TD>BBB</TD>
<TD>1</TD></TR>
<TR>
<TD>SSS</TD>
<TD>1</TD></TR>
<TR>
<TD>AAA</TD>
<TD>2</TD></TR>
<TR>
<TD>EEE</TD>
<TD>2</TD></TR>
<TR>
<TD>CCC</TD>
<TD>4</TD></TR>
<TR>
<TD>DDD</TD>
<TD>2</TD></TR>
<TR>
<TH>Total count</TH>
<TH>13</TH></TR></TABLE>

     OUTPUT 2     HOME     XML     XSL 2     HTML 2     
xslTutorial1
BBB1
SSS1
AAA2
EEE2
CCC4
DDD2
Total count13

     XSL 3     HOME     XML     HTML 3     OUTPUT 3     
<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() &lt; $pos and name()= $name])">
<P><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()&lt; $p and name()=name(current())])">
<xsl:value-of select="name()"/><xsl:text> , </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> ]</xsl:text>
</P>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

     HTML 3     HOME     XML     XSL 3     OUTPUT 3     
<P>xslTutorial [AAA, ]</P>
<P>AAA [BBB, ]</P>
<P>BBB [CCC, EEE, ]</P>
<P>CCC [DDD, ]</P>
<P>EEE [SSS, ]</P>
<P>SSS []</P>
<P>DDD []</P>

     OUTPUT 3     HOME     XML     XSL 3     HTML 3     

xslTutorial [AAA, ]

AAA [BBB, ]

BBB [CCC, EEE, ]

CCC [DDD, ]

EEE [SSS, ]

SSS []

DDD []


     XSL 4     HOME     XML     HTML 4     OUTPUT 4     
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<TABLE border='1' width="90%">
<xsl:apply-templates select="//*"/>
</TABLE>
</xsl:template>
<xsl:template match="*">
<xsl:if test="not(descendant::*[name()=name(current())] | following::*[name()=name(current())])">
<TR><TD><xsl:value-of select="name()"/></TD>
<TD><xsl:apply-templates select="." mode='list'/></TD>
</TR>
</xsl:if>
</xsl:template>
<xsl:template match="*" mode='list'>
<xsl:for-each select="//*[name()=name(current())]/*">
<xsl:value-of select="name()"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

     HTML 4     HOME     XML     XSL 4     OUTPUT 4     
<TABLE border="1" width="90%">
<TR>
<TD>xslTutorial</TD>
<TD>AAAAAA</TD></TR>
<TR>
<TD>BBB</TD>
<TD>CCCEEECCCCCC</TD></TR>
<TR>
<TD>SSS</TD>
<TD/></TR>
<TR>
<TD>AAA</TD>
<TD>BBBEEECCC</TD></TR>
<TR>
<TD>EEE</TD>
<TD>SSS</TD></TR>
<TR>
<TD>CCC</TD>
<TD>DDDDDD</TD></TR>
<TR>
<TD>DDD</TD>
<TD/></TR></TABLE>

     OUTPUT 4     HOME     XML     XSL 4     HTML 4     
xslTutorialAAAAAA
BBBCCCEEECCCCCC
SSS
AAABBBEEECCC
EEESSS
CCCDDDDDD
DDD