我有很多函数可以接受一个输入,例如:
<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中的解决方案。
答案 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>
属性上指定的默认值。