@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