Re: [xsl] How to sort sibling elements based on attribute of child element

Subject: Re: [xsl] How to sort sibling elements based on attribute of child element
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Mon, 06 Jul 2009 17:57:25 -0400
Philip,

At 04:54 PM 7/6/2009, you wrote:
<Root>
    <Stuff>stuff</Stuff>
    <Annotation>
        <Comment Priority="1">my first comment</Comment>
    </Annotation>
    <Annotation>
        <Comment Priority="3">my third comment</Comment>
    </Annotation>
    <Annotation>
        <Comment Priority="2">my second comment</Comment>
    </Annotation>
    <Bother>bother</Bother>
</Root>

Using XSL 1.0 / MSXML6.0, I want to produce the Annotation elements
sorted by @Priority, e.g.

stuff
my first comment
my second comment
my third comment
bother

Constraints:

1. Preceding and following elements e.g. <Stuff> and <Bother>, and
possibly other elements, are optional in the source XML, but must be
output in sequence wrt comments

Assuming this is the case, try


<xsl:template match select="/*">
  <xsl:apply-templates
   select="Annotation[1]/preceding-sibling::*"/>
  <xsl:apply-templates select="Annotation">
    <xsl:sort select="*/@Priority"/>
  </xsl:apply-templates>
  <xsl:apply-templates
   select="Annotation[last()]/following-sibling::*"/>
</xsl:template>

This can also be done using grouping in XSLT 2.0, which is probably clearer albeit no more concise.

Cheers,
Wendell


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