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

时间:2011-06-30 07:06:37

标签: xslt xslt-2.0 xslt-1.0

我有很多函数可以接受一个输入,例如:

<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'"/>

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

我正在寻找XSLT 1.0和XSLT 2.0中的解决方案。

2 个答案:

答案 0 :(得分:5)

在XSLT 2.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>

答案 1 :(得分:1)

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

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

例如输入:

<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命名模板也完全有效;将值传递给参数时,它会覆盖模板select节点的<xsl:param>属性上指定的默认值。