xsl-list
[Top] [All Lists]

Continuous path of elements satisfying a condition

2004-12-18 10:37:59
I have input like this:

<root>
        <item id="1">
                <item id="2">
                        <item id="3"/>
                        <item/>
                </item>
                <item>
                        <item/>
                </item>
                <item id="4"/>
        </item>
        <item>
                <item/>
        </item>
</root>

I am only interested in item elements that have id attributes and form a 
continuous chain
from the child of the root element to a leaf.

1) I can select the leaves and then all the relevant items with

<xsl:variable name="leaves" select="//item[(_at_)id and not(*) and not 
(ancestor::item[not(@id)])]"/>
<xsl:variable name="items" select="$leaves | $leaves/ancestor::item"/>

Is there a better way?

2) In the template for an item, I need to loop through the item's children that 
meet the
conditions (i.e., that are in $items).  I've tried this

<xsl:variable name="nitems" select="count($items)"/>

<xsl:template match="/">
<xsl:apply-templates select="$items"/>
</xsl:template>

<xsl:template match="item">
<xsl:for-each select="item[count(. | $items) = $nitems]">
        ...
</xsl:text>
</xsl:for-each>
</xsl:template>

This is fairly elegant but testing in my environment (MSXML) shows it to take 4 
seconds
while a recursive template that just sums the number of included items that are 
children of the current item runs about 50 lines but takes half the time to run.

Thanks,
Chris


--~------------------------------------------------------------------
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>