Sponsored

XSLT Reference

array:reverse()

XSLT 3.0 array function

Returns a new array with the members in reverse order.

Syntax
array:reverse(array)

Description

array:reverse() returns a new array whose members are in the reverse order of the input array. The function is a convenience over manual head/tail recursion and operates on the array structure directly, preserving each member as-is (including members that are sequences).

Parameters

ParameterTypeRequiredDescription
arrayarray(*)YesThe array whose members are to be reversed.

Return value

array(*) — a new array with members in reverse order; an empty array if the input is empty.

Examples

Reversing a simple array

Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:array="http://www.w3.org/2005/xpath-functions/array">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:variable name="original" select="[10, 20, 30, 40, 50]"/>
    <xsl:variable name="reversed" select="array:reverse($original)"/>
    <result>
      <xsl:for-each select="1 to array:size($reversed)">
        <n><xsl:value-of select="array:get($reversed, .)"/></n>
      </xsl:for-each>
    </result>
  </xsl:template>
</xsl:stylesheet>

Output:

<result>
  <n>50</n>
  <n>40</n>
  <n>30</n>
  <n>20</n>
  <n>10</n>
</result>

Reversing a sorted array for descending order

Input XML:

<?xml version="1.0" encoding="UTF-8"?>
<scores>
  <s>88</s><s>42</s><s>95</s><s>67</s>
</scores>

Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:array="http://www.w3.org/2005/xpath-functions/array">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/scores">
    <xsl:variable name="nums" select="for $s in s return xs:integer($s)"/>
    <!-- sort ascending then reverse for descending -->
    <xsl:variable name="sorted-asc" select="
      fold-left(sort($nums), [],
        function($acc, $n) { array:append($acc, $n) }
      )"/>
    <xsl:variable name="sorted-desc" select="array:reverse($sorted-asc)"/>
    <ranked>
      <xsl:for-each select="1 to array:size($sorted-desc)">
        <rank pos="{.}"><xsl:value-of select="array:get($sorted-desc, .)"/></rank>
      </xsl:for-each>
    </ranked>
  </xsl:template>
</xsl:stylesheet>

Output:

<ranked>
  <rank pos="1">95</rank>
  <rank pos="2">88</rank>
  <rank pos="3">67</rank>
  <rank pos="4">42</rank>
</ranked>

Notes

  • array:reverse() reverses member order only; individual members (including multi-item sequence members) are not affected internally.
  • An empty array returns an empty array without error.
  • For sequence reversal (not arrays), use reverse().

See also