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