我有许多函数接受一个输入,例如:
<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
属性上指定的默认值。