xsl-list
[Top] [All Lists]

RE: Sorting and replacing content

2004-09-01 02:43:16

I have this structure where the content of tags <A> to <E> 
have to determine the order of tag-content <a> to <e>. The 
result needs to be as shown below.

I can manage to make a stylesheet with an <xsl:if> for each 
<A> to <E> asking whether the number is 1, 2, 3, 4 or 5, but 
I am sure there must be a simpler way to do this. I can not 
use position() since the position af the tags can change in 
the structure.

<Root>
<a>10</a>
<b>20</b>
<c>30</c>
<d>40</d>
<e>50</e>
...

...
<A>3</A>
<B>5</B>
<C>1</C>
<D>2</D>
<E>4</E>
</Root>

Result I need:

<no>30</no> <!-- C = 1 has to be first with the value of c 
(which is 30) --> <no>40</no> <no>10</no> <no>50</no> <no>30</no>


How about:

<xsl:variable name="uppercase" select="'ABCDE'"/>
<xsl:variable name="lowercase" select="'abcde'"/>

<xsl:template match="Root">
  <xsl:apply-templates select="A|B|C|D|E">
    <xsl:sort select="." data-type="number"/>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="A|B|C|D|E">
  <xsl:apply-templates select="/Root/*[local-name() =
translate(local-name(current()), $uppercase, $lowercase)]"/>
</xsl:template>

<xsl:template match="a|b|c|d|e">
  <no><xsl:value-of select="."/></no>
</xsl:template>

This sorts the uppercase elements and then calls apply-templates for the
lowercase namesakes.  It produces this output:

<no>30</no><no>40</no><no>10</no><no>50</no><no>20</no>

The last <no> is different to your example output, but I'm guessing
that's a typo.

cheers
andrew


<Prev in Thread] Current Thread [Next in Thread>