Mega Code Archive

 
Categories / XML Tutorial / Xpath
 

If test=not(descendant

File: Data.xml <?xml version="1.0" encoding="utf-8"?> <data>     <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/>       </CCC>     </AAA> </data> 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="/">       <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>   Output: <?xml version="1.0" encoding="UTF-8"?><TABLE border="1" width="90%"><TR><TD>data</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>