RE: [xsl] Keeping comments with relevant node when shorting nodes

Subject: RE: [xsl] Keeping comments with relevant node when shorting nodes
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 14 Jan 2005 23:56:30 -0000
Sounds like it might be a good idea to do an initial pass that wraps the N
element and its preceding comments in a wrapper element. That's a positional
grouping problem:

<xsl:for-each-group select="child::node()" group-ending-with="N">
  <wrapper>
    <xsl:copy-of select="current-group()"/>
  </wrapper>
</xsl:for-each-group>

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Mike Blake-Knox [mailto:mikebk824@xxxxxxxxx] 
> Sent: 14 January 2005 20:33
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Keeping comments with relevant node when 
> shorting nodes
> 
> That sorts nicely but unfortunately, we have several comments in front
> of some node.
> 
> I haven't been able to come up with a method of grouping the comments
> with their associated nodes. Would you have any suggestions?
> 
> The current xsl is:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> <xsl:output indent="yes" method="xml"/>
> 
> <xsl:template match="node() | @*">
> <xsl:copy>
> <xsl:apply-templates select="@* | node()"/>
> </xsl:copy>
>    </xsl:template>
> 
>  <xsl:template match="Ns">
>      <xsl:copy>
>          <xsl:apply-templates select="N">
>             <xsl:sort select="@name"/>
>        </xsl:apply-templates>
>      </xsl:copy>
> </xsl:template>
> 
> <xsl:template match="N">
> <xsl:copy-of 
> select="preceding-sibling::node()[normalize-space()][1][self::
> comment()]
> "/>
> <xsl:copy-of select="."/>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> 
> 
> On Thu, 13 Jan 2005 23:21:51 -0000, Michael Kay 
> <mike@xxxxxxxxxxxx> wrote:
> > Try:
> > 
> > <xsl:apply-templates select="N">
> >  <xsl:sort select="@name"/>
> > </xsl:apply-templates>
> > 
> > <xsl:template match="N">
> >  <xsl:copy-of select="preceding-sibling::comment()[1]
> >  <xsl:copy-of select="."/>
> > </xsl:template>
> > 
> > This assumes that every N element has an associated comment.
> > 
> > Michael Kay
> > http://www.saxonica.com/
> > 
> > > -----Original Message-----
> > > From: Mike Blake-Knox [mailto:mikebk824@xxxxxxxxx]
> > > Sent: 13 January 2005 22:32
> > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > > Subject: [xsl] Keeping comments with relevant node when 
> shorting nodes
> > >
> > > I have several XML files like the following:
> > >
> > > <!-- CNs-->
> > > <Ns>
> > >     <!--CN1-->
> > >     <N name="N1">
> > >         <Ms>
> > >             <!--C1N3-->
> > >             <M name="1N3"/>
> > >             <!--C1N1-->
> > >             <M name="1N1"/>
> > >             <!--C1N2-->
> > >             <M name="1N2"/>
> > >         </Ms>
> > >     </N>
> > >     <!--CN2-->
> > >      <N name="N2">
> > >          <Ms>
> > >              <!--C2N2-->
> > >              <M name="2N2"/>
> > >              <!--C2N3-->
> > >              <M name="2N3"/>
> > >              <!--C2N1-->
> > >              <M name="2N1"/>
> > >          </Ms>
> > >      </N>
> > > </Ns>
> > >
> > >
> > > I'd like to sort them while keeping comments with the 
> nodes they refer
> > > to (e.g., keep <!--CN2--> with <M name="2N2"/>).
> > >
> > > I've tried the following xslt:
> > >
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <xsl:stylesheet version="1.0"
> > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> > >       <xsl:output indent="yes" method="xml"/>
> > >
> > > <xsl:template match="node() | @*">
> > >   <xsl:copy>
> > >     <xsl:apply-templates select="@* | node()"/>
> > >   </xsl:copy>
> > > </xsl:template>
> > >
> > > <xsl:template match="Ns">
> > >     <xsl:copy>
> > >         <xsl:apply-templates select="comment()| N" >
> > >           <xsl:sort select="@name"/>
> > >         </xsl:apply-templates>
> > >     </xsl:copy>
> > > </xsl:template>
> > > </xsl:stylesheet>
> > >
> > > It sorts fine but puts the comments  for all the N nodes 
> together at
> > > the top of the Ns element. I've played around with trying 
> to group the
> > > comments and N nodes using preceding-sibling but have not been
> > > succesful.
> > >
> > > Any ideas?
> > >
> > > Thanks
> > >
> > > --
> > > Mike Blake-Knox
> > 
> > 
> 
> 
> -- 
> Mike Blake-Knox

Current Thread