Решение XSLT 1.0 с использованием FXSL
Библиотека FXSL предлагает ряд общих функций для обработки списка. Почти все из них имеют аналог для работы со строками (рассматривая строку как список символов).
Вот пример использования функции / шаблона str-foldl
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dvc-foldl-func="dvc-foldl-func"
exclude-result-prefixes="xsl dvc-foldl-func"
>
<xsl:import href="dvc-str-foldl.xsl"/>
<dvc-foldl-func:dvc-foldl-func/>
<xsl:variable name="vFoldlFun" select="document('')/*/dvc-foldl-func:*[1]"/>
<xsl:output encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:call-template name="dvc-str-foldl">
<xsl:with-param name="pFunc" select="$vFoldlFun"/>
<xsl:with-param name="pStr" select="123456789"/>
<xsl:with-param name="pA0" select="0"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="dvc-foldl-func:*">
<xsl:param name="arg1" select="0"/>
<xsl:param name="arg2" select="0"/>
<xsl:value-of select="$arg1 + $arg2"/>
</xsl:template>
</xsl:stylesheet>
Это преобразование вычисляет сумму символов в строке , переданных как параметр $pStr
, и дает правильный результат:
45
И используя шаблон / функцию str-map
, мы имеем следующее простое и короткое решение:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:testmap="testmap"
exclude-result-prefixes="xsl testmap"
>
<xsl:import href="str-dvc-map.xsl"/>
<!-- to be applied on any xml source -->
<testmap:testmap/>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>
<xsl:call-template name="str-map">
<xsl:with-param name="pFun" select="$vTestMap"/>
<xsl:with-param name="pStr" select="'Some Text'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="split" match="*[namespace-uri() = 'testmap']">
<xsl:param name="arg1"/>
<para><xsl:value-of select="$arg1"/></para>
</xsl:template>
</xsl:stylesheet>
При применении к любому XML-файлу (не используется), получается нужный, правильный результат :
<para>S</para>
<para>o</para>
<para>m</para>
<para>e</para>
<para> </para>
<para>T</para>
<para>e</para>
<para>x</para>
<para>t</para>