将一系列函数应用于文本节点

时间:2014-08-08 12:05:34

标签: xslt xslt-2.0

我必须将一系列函数应用于文本节点。 目前,它看起来像这样:

<xsl:function name="local:enhanceTypo" as="text()">
  <xsl:param name="s"/>
  <xsl:value-of select="

    replace(
      replace(
        translate($s,'&lt;&gt;','‹›')
        ,'a.a.O.','a.&#x2006;a.&#x2006;O.'
      )
      ,'z.B.','z.&#x2006;B.')
  "/>
</xsl:function>

local:enhanceTypo中还有很多工作要做,将它作为一系列嵌套函数调用似乎很有趣。

在XSLT2中是否有一种易于阅读和理解的方法,可以将大量函数依次应用到我的字符串中?

1 个答案:

答案 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应用函数序列。

有趣,是吗?