@xiaoyi は正しく、を使用する主な代替手段を示していconcat()
ます。concat()
ただし、を繰り返し続ける必要があるため、 よりもさらに表記が多くなります<xsl:value-of select="..." />
。
別の良い方法は、属性値テンプレート(AVT)を使用することです。
[...]CREATE USER {username}, identified by {password};
[...]
ただし、ATV は (特定の) 属性でのみ使用でき、テキスト ノードでは (直接) 使用できません。この目的のためにそれらをどのように使用しますか?
XSLT 2.0 の 1 つの方法は、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
属性を使用して各文字列を識別できます。
この方法が他の場所で提唱されているのを見たことがないので、他の人がそれについてどう思うか知りたい.
気にしないで...
Michael Kay's answer で示されているより単純なアプローチを考えると、このようにする意味はないと思います。他の人がこの方法を提唱していない理由は、それで説明できると思います。:-)
このアプローチがまだ有効であると私が考えることができる唯一の状況は、XSLT 2.0 を使用できないが、nodeset()
拡張機能にアクセスできる場合です (IE または .NET 環境など)。その場合、以前に XPath 式で使用した場所でラップnodeset( )
アラウンドする必要があります。$queries
/