[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

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


Subject: Re: [xsl] Keeping comments with relevant node when shorting nodes
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Fri, 14 Jan 2005 18:13:16 -0500

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>


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


Current Thread
Keywords