如何内联调用 XSLT 模板?例如,而不是:
<xsl:call-template name="myTemplate" >
<xsl:with-param name="param1" select="'val'" />
</xsl:call-template>
我可以使用 XSLT 内置函数调用样式吗,如下所示:
<xls:value-of select="myTeplate(param1)" />
如何内联调用 XSLT 模板?例如,而不是:
<xsl:call-template name="myTemplate" >
<xsl:with-param name="param1" select="'val'" />
</xsl:call-template>
我可以使用 XSLT 内置函数调用样式吗,如下所示:
<xls:value-of select="myTeplate(param1)" />
在 XSLT 2.0 中,您可以使用xsl:function定义自己的自定义函数
XML.com 上的一篇文章描述了如何在 XSLT 2.0 中编写自己的函数:http ://www.xml.com/pub/a/2003/09/03/trxml.html
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="http://whatever">
<!-- Compare two strings ignoring case, returning same
values as compare(). -->
<xsl:function name="foo:compareCI">
<xsl:param name="string1"/>
<xsl:param name="string2"/>
<xsl:value-of select="compare(upper-case($string1),upper-case($string2))"/>
</xsl:function>
<xsl:template match="/">
compareCI red,blue: <xsl:value-of select="foo:compareCI('red','blue')"/>
compareCI red,red: <xsl:value-of select="foo:compareCI('red','red')"/>
compareCI red,Red: <xsl:value-of select="foo:compareCI('red','Red')"/>
compareCI red,Yellow: <xsl:value-of select="foo:compareCI('red','Yellow')"/>
</xsl:template>
</xsl:stylesheet>
XSLT 的语法在第一个示例中是正确的。你也可以写
<xsl:call-template name="myTemplate" >
<xsl:with-param name="param1">val</xsl:with-param>
</xsl:call-template>
我不确定您在第二个代码片段中要做什么(缺少“val”,并且有两个拼写错误(xls 和 myTeplate)),但它不是有效的 XSLT.I n
更新如果我现在理解您的问题,那不是“XSLT 模板是否有替代语法?” 但是“我可以在 XSLT 中编写自己的函数吗?”。
是的你可以。这是一个有用的介绍。请注意,您必须在库中提供 Java 代码,这可能不容易分发(例如在浏览器中)。试试http://www.xml.com/pub/a/2003/09/03/trxml.html
使用一个processing-instruction
和一个匹配的模板来应用参数来做到这一点:
<?xml version="1.0" encoding="utf-8"?>
<!-- Self-referencing Stylesheet href -->
<?xml-stylesheet type="text/xsl" href="dyn_template_param.xml"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
>
<!--HTML5 doctype generator-->
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" />
<!--Macro references-->
<?foo param="hi"?>
<?foo param="bye"?>
<!--Self-referencing template call-->
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/">
<!--HTML content-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<!--Macro template calls-->
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="processing-instruction('foo')">
<xsl:param name="arg" select="substring-after(.,'=')"/>
<xsl:if test="$arg = 'hi'">
<p>Welcome</p>
</xsl:if>
<xsl:if test="$arg = 'bye'">
<p>Thank You</p>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
参考