是否有调用单参数XSL函数的快捷方式



我有许多函数接受一个输入,例如:

<xsl:template name="F">
    <xsl:param name="input"/>
    ... ...
</xsl:template>

要调用函数,我需要写:

<xsl:call-template name="F">
    <xsl:with-param name="input" select="'jkljkljkl'"/>
</xsl:call-template>

这似乎过于冗长。既然函数只有一个参数,为什么我们必须编写xsl:with-param节点?

是否有调用单参数函数的快捷方式?

我希望能够做这样的事情:

<xsl:call-template name="F" select-param="'jkljkl'"/>

它简短而甜蜜,同样不含糊(因为只有一个参数)。我们如何才能以一种简短而甜蜜的方式调用单参数函数?

我正在寻找XSLT1.0和XSLT2.0的解决方案。

在XSLT2.0中,您可以通过以下方式编写自己的函数

  • 声明您的命名空间
  • 使用xsl:function声明将函数定义为转换根元素的子元素

示例:

<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:nTan="http://nTan.comr">
  <xsl:function name="nTan:Hello">
   <xsl:param name="string1"/>
    <xsl:value-of select="concat('Hello ',$string1)"/>
  </xsl:function>
  <xsl:template match="/">
    <xsl:value-of select="nTan:Hello('World!')"/>
  </xsl:template>
</xsl:stylesheet>

您不能这样做,但是,值得注意的是,当您调用命名模板时,上下文节点不会更改。根据上下文的不同,您可以让命名模板直接访问您将作为参数传入的内容。

也可以使用一个参数将当前上下文节点设置为默认值,这样您就可以在不使用参数的情况下调用它来引用当前节点,或者可以选择传入节点。

例如输入:

<foo>
  <input>xxx</input>
</foo>

取而代之的是:

<xsl:template match="foo">
  <xsl:call-template name="bar">
    <xsl:with-param name="myparam" select="input" />
  </xsl:call-template>
</xsl:template>
<xsl:template name="bar">
  <xsl:param name="myparam" />
  <xsl:value-of select="concat('Value:',$myparam)" />
</xsl:template>

你可以直接做

<xsl:template match="input">
  <xsl:call-template name="bar" />
</xsl:template>
<xsl:template name="bar">
  <xsl:param name="myparam" select="." />
  <xsl:value-of select="concat('Value:',$myparam)" />
</xsl:template>

在这两种情况下,$myparam将是input节点。第一个例子中的foo模板与第二个例子中命名的bar模板也完全有效;将值传递给参数时,它会覆盖在模板<xsl:param>节点的select属性上指定的默认值。

相关内容

  • 没有找到相关文章

最新更新