我必须将一系列函数应用于文本节点。 目前,它看起来像这样:
<xsl:function name="local:enhanceTypo" as="text()">
<xsl:param name="s"/>
<xsl:value-of select="
replace(
replace(
translate($s,'<>','‹›')
,'a.a.O.','a. a. O.'
)
,'z.B.','z. B.')
"/>
</xsl:function>
在local:enhanceTypo
中还有很多工作要做,将它作为一系列嵌套函数调用似乎很有趣。
在XSLT2中是否有一种易于阅读和理解的方法,可以将大量函数依次应用到我的字符串中?
答案 0 :(得分:2)
当然链接变量是一种方式。在执行此操作时,我经常重复使用相同的变量名称:
<xsl:variable name="v" select="replace($v, ....)"/>
<xsl:variable name="v" select="replace($v, ....)"/>
<xsl:variable name="v" select="replace($v, ....)"/>
因为很容易看到发生了什么,并在序列中添加额外的调用。我不能说其他处理器,但是在Saxon中,当你这样做时,变量会自动内联,所以它就像你编写深度嵌套的函数调用一样,只是更容易阅读。
如果您使用的是高阶函数,那么使用3.0还有另一种方法。您可以定义一系列函数,如下所示:
<xsl:variable name="replacements" select="
replace(?, "a", "A"),
replace(?, "b", "B"),
replace(?, "c", "C")"/>
然后你可以对这个序列进行左折操作:
fold-left($replacements, $string, function ( $in, $f ) { $f($in) })
如果你的原始和替换字符串是两个xs:string * variables $ in和$ out,那么你可以改为将函数序列定义为
<xsl:variable name="replacements" select="
for-each-pair($in, $out, function($i, $o){ replace(?, $i, $o) })"/>
也就是说,对于每对输入和输出字符串,您创建一个函数,用此输出替换此输入,然后使用fold-left应用函数序列。
有趣,是吗?