All,
I was impressed to receive three different ways of solving my problem.
I started with Wendell's then added a sort (in-place). I then realised
that I didn't need to actually put the comments inside the output N
elements and used copy-of in the Ns/N template to generate them before
the N elements.
Thanks very much.
Here's the resulting xslt code in case it helps anyone else:
<?xml version="1.0"?>
<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:key name="comments-by-owner" match="comment() | text()"
use="generate-id(following-sibling::*[1])"/>
<xsl:template match="Ns/child::text()|N/child::text()">
</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="Ns/N">
<xsl:copy-of select="key('comments-by-owner',generate-id())"/>
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Mike
On Fri, 14 Jan 2005 18:13:16 -0500, Wendell Piez
<wapiez(_at_)mulberrytech(_dot_)com> wrote:
Hi Mike,
Keys are useful for this kind of grouping in XSLT 1.0.
I've never retrieved comments with a key, but that doesn't make it impossible:
<xsl:key name="comments-by-owner" match="comment()"
use="generate-id(following-sibling::*[1])"/>
This key will retrieve all the comments that precede a given element
(sibling), except those that also precede an earlier element.
Then when you have
<!-- comment 1 -->
<!-- comment 2 -->
<!-- comment 3 -->
<node/>
<!-- comment 4 -->
<!-- comment 5 -->
<node/>
<xsl:template match="node">
<xsl:copy>
<xsl:copy-of select="key('comments-by-owner',generate-id())"/
</xsl:copy>
</xsl:template>
would move the comments that "belong" to each node, inside it:
<node>
<!-- comment 1 -->
<!-- comment 2 -->
<!-- comment 3 -->
</node>
<node>
<!-- comment 4 -->
<!-- comment 5 -->
</node>
This uses the key-based idiom for positional grouping you'll find
documented at www.jenitennison.com (which we use typically to create
hierarchies out of flat structures -- as I've done in the example above).
XSLT 2.0 has nice grouping constructs you can use for this: look Ma, no keys.
Cheers,
Wendell
At 03:32 PM 1/14/2005, you wrote:
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>
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>
--~--
--
Mike Blake-Knox
--~------------------------------------------------------------------
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>
--~--