[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Select nodes with an attribute but not all the nod

Subject: RE: Select nodes with an attribute but not all the nodes
From: <mysrdr-wrk@xxxxxxxxx>
Date: Fri, 19 May 2006 11:28:55 -0700 (PDT)
w r k corporation
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:  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:  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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.