@xiaoyi 是对的,展示了 using 的主要替代方案concat()
。然而,这甚至比 更重符号concat()
,因为你必须不断重复<xsl:value-of select="..." />
。
一个不错的选择是使用属性值模板(AVT):
[...]CREATE USER {username}, identified by {password};
[...]
但是 ATV 仅适用于(某些)属性,而不适用于文本节点(直接)。您如何将它们用于此目的?
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 表达式中使用它的任何地方nodeset( )
环绕。$queries
/