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

Re: [xsl] Merging elements


Subject: Re: [xsl] Merging elements
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Thu, 27 Oct 2011 18:48:10 -0400

Hi,

Sibling recursion would work for this, but so would this, I think. Plus it might (or might not) be easier to maintain:

<xsl:template match="p">
  <p>
    <xsl:call-template name="merge-spans"/>
  </p>
</xsl:template>

<xsl:template name="merge-spans">
  <xsl:for-each-group select="node()" group-adjacent="m:class(.)">
    <xsl:choose>
      <xsl:when test="string(current-grouping-key())">
        <span class="{current-grouping-key()}">
          <xsl:apply-templates
            select="current-group()" mode="merged"/>
        </span>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="current-group()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
</xsl:template>

<xsl:function name="m:class" as="xs:string">
  <!-- returns a class value for a span, or the class value of an
  immediately preceding span for whitespace-only text,
  comment or PI nodes -->
  <xsl:param name="s" as="node()"/>
  <xsl:sequence select="($s/self::span/@class,
    $s/(self::text()[not(normalize-space())] |
        self::comment() |
        self::processing-instruction() )/
       preceding-sibling::*[1][self::span]/@class,
    '')[1]"/>
</xsl:function>

<xsl:template match="node()" mode="merged">
  <xsl:apply-templates select="."/>
</xsl:template>

<xsl:template match="span[@class]" mode="merged">
  <xsl:apply-templates/>
</xsl:template>

Cheers,
Wendell

On 10/27/2011 4:13 AM, Nic Gibson wrote:
<p><span class="strong-emphasis">Fome</span> <span class="strong-emphasis">Zero</span>
        <span class="strong">: la stratigie du Brisil pour risoudre les problhmes de l'insicuriti alimentaire et de la faim </span></p>

And also:

<p><span class="strong">C</span><span class="strong">ontexte</span></p>

I need to merge those spans with identical class attribute values along with the whitespace to get something like:

<p><span class="strong-emphasis">Fome Zero</span>
        <span class="strong">: la stratigie du Brisil pour risoudre les problhmes de l'insicuriti alimentaire et de la faim </span></p>

And:

<p><span class="strong">Contexte</span></p>


-- ====================================================================== 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