@xiaoyi是正确的,显示主要替代使用concat()
。但是,这比concat()
更重要,因为您必须不断重复<xsl:value-of select="..." />
。
一个不错的选择是使用attribute value templates(AVTS):
[...]CREATE USER {username}, identified by {password};
[...]
全地形车,但仅适用于(某些)属性,而不是文本节点(直接)。你如何使用它们来达到这个目的?
XSLT 2.0中的一种方法是使用AVT创建具有属性的新文字结果元素;使用AVT指定该属性的值;然后选择新属性的值:
<xsl:variable name="query">
<dummy val="[...]CREATE USER {username}, identified by {password};
[...]" />
</xsl:variable>
<xsl:value-of select="$query//@val" />
是的,这是每个格式化字符串一些显著的开销,但有字符串中的每场非常小的开销。你可以做几个串在一起,就像这样:
<xsl:variable name="queries">
<q val="[...]CREATE USER {username}, identified by {password}; [...]" />
<q val="[...]CREATE TABLE {tablename}, blah blah; [...]" />
</xsl:variable>
<xsl:value-of select="$queries/q[1]/@val" />
<xsl:value-of select="$queries/q[2]/@val" />
您可以使用位置索引如上,或使用id
属性,以确定每个字符串。
我还没有看到在其他地方提倡的这种方法,所以我会好奇听到别人怎么看待它。
没关系,只是...
鉴于迈克尔·凯的回答,我不认为有一个在做这种方式的任何地方所示的简单的方法。我想这解释了为什么其他人不主张这种方法。 :-)
唯一的情况是我可以想到这种方法仍然可以使用的是,如果您不能使用XSLT 2.0,但您可以访问nodeset()
扩展功能(例如在IE或.NET环境中)。在这种情况下,无论您在/
之前的XPath表达式中使用它,您都需要将换成$queries
左右。
我想你可以扩大它,就像' textnode textnode ... ' –
xiaoyi