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

Subject: Re: [xsl] Keeping comments with relevant node when shorting nodes
From: Mike Blake-Knox <mikebk824@xxxxxxxxx>
Date: Fri, 14 Jan 2005 15:32:56 -0500
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