xsl-list
[Top] [All Lists]

RE: XPatch: ancestor and count

2004-09-30 23:10:09
Andrey,

I slightly modified the XSLT like that

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="html"/>
<xsl:template match="menu">
  <table class="menu" border="1">
    <tr><td><xsl:value-of
select="count(ancestor::*)"/></td><td>&#xA0;</td></tr>
    <xsl:for-each select="descendant::menuitem">
     <tr><td><xsl:for-each select="ancestor::*">/<xsl:value-of
select="concat(local-name(), ' ', @title)"/></xsl:for-each></td><td>
     <xsl:value-of select="@title"/></td></tr>
    </xsl:for-each>
  </table>
</xsl:template>
</xsl:stylesheet>

I got consistent results with XalanJ, Saxon 6, Saxon 8, MSXML,
XslTransform.
        
0   
/menu                                   1 
/menu                                   2 
/menu /menuitem 2                       2.1 
/menu                                   3 
/menu /menuitem 3                       3.1 
/menu /menuitem 3                       3.2 
/menu /menuitem 3                       3.3 
/menu /menuitem 3                       3.4 
/menu /menuitem 3/menuitem 3.4  3.4.1 
/menu /menuitem 3/menuitem 3.4  3.4.2 
/menu /menuitem 3                       3.5 
/menu /menuitem 3                       3.6 
/menu /menuitem 3/menuitem 3.6  3.6.1 
/menu /menuitem 3/menuitem 3.6  3.6.2

You may try with LibXSLT to see what path comes out.

Ivan



-----Original Message-----
From: Andrey V. Elsukov [mailto:elsukov(_at_)rdu(_dot_)kirov(_dot_)ru]
Sent: Friday, October 01, 2004 1:18 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] XPatch: ancestor and count

Hi,

I have some XML file, for example:
=======
<menu>
      <menuitem title="1"/>
      <menuitem title="2">
        <menuitem title="2.1"/>
      </menuitem>
      <menuitem title="3">
        <menuitem title="3.1"/>
        <menuitem title="3.2"/>
        <menuitem title="3.3"/>
        <menuitem title="3.4">
              <menuitem title="3.4.1"/>
              <menuitem title="3.4.2"/>
        </menuitem>
        <menuitem title="3.5"/>
        <menuitem title="3.6">
              <menuitem title="3.6.1"/>
              <menuitem title="3.6.2"/>
        </menuitem>
      </menuitem>
</menu>
======
and XLS transform:
======
<xsl:template match="menu">
  <table class="menu">
    <tr><td><xsl:value-of
select="count(ancestor::*)"/></td><td>&#xA0;</td></tr>
    <xsl:for-each select="child::menuitem">
     <tr><td><xsl:value-of select="count(.//ancestor::*)"/></td><td>
     <xsl:value-of select="@title"/></td></tr>
    </xsl:for-each>
  </table>
</xsl:template>
======
In result the following:
======
1         - root element
2    1    - root, menu
3    2    - root, menu, menuitem "2"
5    3    - root, menu, menuitem "3", menuitem "3.4" and what???
======
http://www.w3.org/TR/1999/REC-xpath-19991116 :
* the ancestor axis contains the ancestors of the context node;
the ancestors of the context node consist of the parent of context
node and the parent's parent and so on;..

* Function: number count(node-set)
The count function returns the number of nodes in the argument
node-set.
======
Why the result is 5? It should be equal 4, or not?

PS. I use Perl-5.8.5 + LibXML + LibXSLT..
--
Best regards,
Andrey V. Elsukov




--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--




<Prev in Thread] Current Thread [Next in Thread>