Subject: Re: 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
======================================================================
|