xsl-list
[Top] [All Lists]

Re: [xsl] passing filtered tree to template

2011-06-06 11:12:28
Hi Stefan,

The easy way out here is to add the filter to the matching template instruction, and add another matching template for those that don't match, or, if all "item" elements need to be processed in the same way, but item with property=x need to be processed with an extra instruction, something like this should work:

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

<!-- called ONLY when property X is true -->
<xsl:template match="item[property='x']">
    <myItem>
        <xsl:value-of select="index"/>
    </myItem>
</xsl:template>

<!-- called for all other situations (may leave empty if you don't want to process 
them) -->
<xsl:template match="item">
    <otherItem>
        <xsl:value-of select="index"/>
    </otherItem>
</xsl:template>

I have to note that I found your instruction a tad confusing, so if I 
misunderstood, please try to clarify with a simplified input/output example of 
XML.


Kind regards,

Abel Braaksma



On 6-6-2011 17:56, Stefan Hunziker wrote:
Hi
I have the following problem: Given an xml like the following:

<test>
     <items>
         <item>
             <index>1</index>
             <property>x</property>
         </item>
         <item>
             <index>2</index>
             <property>y</property>
         </item>
         <item>
             <index>3</index>
             <property>x</property>
         </item>
     </items>
</test>


and a stylesheet like:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
     <xsl:template match="test">
         <myTest>
         <xsl:variable name="xItems">
             <xsl:copy-of select="items"/>
         </xsl:variable>
             <xsl:apply-templates
select="items[item/property='y']"/><!-- wrong try! -->
         </myTest>
     </xsl:template>

     <xsl:template match="items">
         <xsl:for-each select="item">
             <myItem>
                 <xsl:value-of select="index"/>
             </myItem>
         </xsl:for-each>
     </xsl:template>
</xsl:stylesheet>



I would like to pass only the items with property='x' to the items
matching template. The first try as written above of course doesn't
work, if there is an x item then the whole tree is passed, if there is
none, nothing is passed. I do further processing in the items
template, so I don't want to change it to match="item" or to apply the
filter in the items template.

Any help is much appreciated!

thanks, kind regards

Stefan

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




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