Может быть неудобно получать доступ к каждому из множества (скажем, сотен) результатов, представленных в одной строке .
Именно здесь мощь XML и XPath может быть наилучшейувиденный и использованный: создайте дерево XML как результат .
Вот пример:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:call-template name="sequenceStatistics">
<xsl:with-param name="pSeq" select="*"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="sequenceStatistics">
<xsl:param name="pSeq"/>
<xsl:variable name="vCount" select="count($pSeq)"/>
<results>
<count><xsl:value-of select="$vCount"/></count>
<xsl:for-each select="$pSeq">
<xsl:sort data-type="number"/>
<xsl:choose>
<xsl:when test="position() = 1">
<min><xsl:value-of select="."/></min>
</xsl:when>
<xsl:when test="position() = $vCount">
<max><xsl:value-of select="."/></max>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML :
<nums>
<num>7</num>
<num>3</num>
<num>9</num>
<num>10</num>
<num>4</num>
<num>2</num>
<num>5</num>
<num>08</num>
<num>6</num>
<num>1</num>
</nums>
желаемый, правильный результат получен :
<results>
<count>10</count>
<min>1</min>
<max>10</max>
</results>
Примечание :
Если результат находится в теле переменной, тип переменной - RTF (Фрагмент дерева результатов), и он должен быть преобразован в обычное дерево с помощью функции xxx:node-set()
перед узлами.результата можно получить индивидуально.В XPath 2.0 (XSLT 2.0) такого ограничения нет.
Как показывает этот пример, нет необходимости в рекурсии для получения максимума и минимума последовательности - даже в XSLT 1.0.