RE: [xsl] Select nodes with an attribute but not all the nodes

Subject: RE: [xsl] Select nodes with an attribute but not all the nodes
From: <mysrdr-wrk@xxxxxxxxx>
Date: Fri, 19 May 2006 11:28:55 -0700 (PDT)
I was just putting it through Dimitre's xpath
visualizer.  :^)

Thanks for your help, Michael, I finally understand p.
295-298....now, about keys....  ;^)

--- Michael Kay <mike@xxxxxxxxxxxx> wrote:

> It needed a little bit of tweaking:
> 
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:transform version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>     
>     <xsl:output indent="yes" method="xml"
> omit-xml-declaration="no"
>         encoding="UTF-8"/>
>     
>     <xsl:template match="doc">
>         <doc>
>         <xsl:for-each-group select="level2"
>            
> group-starting-with="*[not(name/@attachpart)]">
>             <record>
>                 <name><xsl:value-of
> select="name"/></name>
>                 <attachingPart>
>                     <xsl:value-of
> select="current-group()[name/@attachpart]/number"/>
>                 </attachingPart>
>             </record>
>         </xsl:for-each-group> 
>         </doc>
>     </xsl:template>
>         
> </xsl:transform>
> 
> Michael Kay
> http://www.saxonica.com/ 
> 
> > -----Original Message-----
> > From: mysrdr-wrk@xxxxxxxxx
> [mailto:mysrdr-wrk@xxxxxxxxx] 
> > Sent: 19 May 2006 18:19
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: RE: [xsl] Select nodes with an attribute
> but not all 
> > the nodes
> > 
> > I was thinking sequentially...down the elements as
> they occur. 
> > 
> > When I tried your suggestion the <number> element
> came up 
> > blank. Did I do this correctly?
> > 
> > XSL:
> > <?xml version="1.0" encoding="utf-8"?>
> > <xsl:transform version="2.0"
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> >     
> >     <xsl:output indent="yes" method="xml"
> > omit-xml-declaration="no"
> >         encoding="UTF-8"/>
> >     
> >     <xsl:template match="doc">
> >         <doc>
> >         <xsl:for-each-group select="level2"
> >            
> group-starting-with="*[not(@attachpart)]">
> >             <record>
> >                 <name><xsl:value-of
> > select="name"/></name>
> >                 <attachingPart>
> >                     <xsl:value-of
> > select="current-group()[@attachpart]/number"/>
> >                 </attachingPart>
> >             </record>
> >         </xsl:for-each-group> 
> >         </doc>
> >     </xsl:template>
> >         
> > </xsl:transform>
> > 
> > XML:
> > <?xml version="1.0" encoding="UTF-8"?>
> > <doc>
> > <level2>
> >     <name>box</name>
> >     <number>1234</number>
> > </level2>
> >  <level2>
> >       <name attachpart = '1'>washer</name>
> >           <number>234</number>
> >   </level2>
> >   <level2>
> >       <name attachpart = '1'>screw</name>
> >           <number>345</number>
> >   </level2>
> >   <level2>
> >       <name attachpart='1'>bolt</name>
> >           <number>456</number>
> >   </level2>
> >   <level2>
> >       <name>nameplate</name>
> >       <number>9876</number>
> >   </level2>
> >   <level2>
> >       <name>switch</name>
> >       <number>7654</number>
> >   </level2>
> >   <level2>
> >       <name attachpart='1'>screw</name>
> >           <number>345</number>
> >   </level2>
> > </doc>
> > 
> > OUTPUT:
> > <?xml version="1.0" encoding="UTF-8"?>
> > <doc>
> >    <record>
> >       <name>box</name>
> >       <attachingPart/>
> >    </record>
> >    <record>
> >       <name>washer</name>
> >       <attachingPart/>
> >    </record>
> >    <record>
> >       <name>screw</name>
> >       <attachingPart/>
> >    </record>
> >    <record>
> >       <name>bolt</name>
> >       <attachingPart/>
> >    </record>
> >    <record>
> >       <name>nameplate</name>
> >       <attachingPart/>
> >    </record>
> >    <record>
> >       <name>switch</name>
> >       <attachingPart/>
> >    </record>
> >    <record>
> >       <name>screw</name>
> >       <attachingPart/>
> >    </record>
> > </doc>
> > 
> > Thanks for your help.
> > 
> > Regard
> > Hermy
> > 
> > --- Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > 
> > > It's dangerous to use the word "when" in your
> problem statement 
> > > because it suggests you are thinking in terms of
> order of execution.
> > > 
> > > What you've got here is a positional grouping
> > > problem:
> > > 
> > > <xsl:for-each-group select="level2"
> > > group-starting-with="*[not(@attachpart)]">
> > > <record>
> > >   <name><xsl:value-of select="name"/></name>
> > >   <attachingPart>
> > >     <xsl:value-of
> > > select="current-group()[@attachpart]/number"/>
> > >   </attachingPart>
> > > </record>
> > > </xsl:for-each>
> > > 
> > > Michael Kay
> > > http://www.saxonica.com/
> > > 
> > > > -----Original Message-----
> > > > From: mysrdr-wrk@xxxxxxxxx
> > > [mailto:mysrdr-wrk@xxxxxxxxx]
> > > > Sent: 19 May 2006 17:06
> > > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > > > Subject: [xsl] Select nodes with an attribute
> but
> > > not all the nodes
> > > > 
> > > > I am making an XML to XML transform using XSLT
> 2.0
> > > and Saxon
> > > > 8B.  I need to select certain nodes based on
> an
> > > attribute,
> > > > but when I find a node without the attribute I
> > > want to stop
> > > > selecting nodes even if subsequent siblings
> have
> > > the attribute.  
> > > >    
> > > >   <level2>
> > > >               <name>box</name>
> > > >               <number>1234</number>
> > > >   </level2>
> > > >   <level2>
> > > >               <name
> attachpart="1">washer</name>
> > > >               <number>234</number>
> > > >   </level2>
> > > >   <level2>
> > > >               <name
> attachpart="1">screw</name>
> > > >               <number>345</number>
> > > >   </level2>
> > > >   <level2>
> > > >               <name attachpart="1">bolt</name>
> > > >               <number>456</number>
> > > >   </level2>
> > > >   <level2>
> > > >               <name>nameplate</name>
> > > >               <number>9876</number>
> > > >   </level2>
> > > >   <level2>
> > > >               <name>switch</name>
> > > >               <number>7654</number>
> > > >   </level2>
> > > >   <level2>
> > > >               <name
> attachpart="1">screw</name>
> > > >               <number>345</number>
> > > >   </level2>
> > > >    
> > > >   The washer screw and bold are attaching
> parts
> > > for the box. 
> > > > I need to output these in an <attachingPart>
> > > element.  
> > > >    
> > > >   <record>
> > > >               <name>box</name>
> > > >               <attachingPart>234 345
> 456</attachingPart>
> > > >   </record>
> > > >    
> > > >   Depending on how I approach the code, I get
> > > nothing or just
> > > > the washer or I get *all* of the parts that
> have
> > > the
> > > > attachpart attribute.  Is there some way to
> say
> > > stop
> > > > selecting attachpart nodes when a level2
> doesn't
> > > have the
> > > > attribute?  It's sounds so simple but I'm not
> > > getting
> > > > anywhere with it. 
> > > >  
> > > > I've been reading both Michael and Jeni and
> > > checking the
> > > > archives.  Some things look close but I get
> the
> > > same results. 
> > > > The answer is probably right in front of my
> face
> > > but I've
> > > > been looking at it so long I can't see the
> forest
> > > for the trees.
> > > >    
> > > >   Regards,
> > > >   Hermy

Current Thread