2

XSLT(2.0) ファイルがあります。これは、入力 XML データ ファイルを受け取り、DDL/SQL ステートメントを作成します。それはうまく動作します。ただし、次のような「concat」ステートメントに多くのフォーマット情報が含まれているため、維持するのが少し難しいです。

<xsl:value-of select="concat('CREATE USER ',$username,' IDENTIFIED BY ',$password,';',$nl)"/>

私がやりたいことは、代わりに次のような方法で SQL ステートメントをエンコードすることです。

<some-enclosing-elements>[...]CREATE USER <username/>, identified by <password/>; [literally a newline here][...]</some-enclosing-elements>

XSLT またはデータ ドキュメント自体の上部にある「ルックアップ」テーブル内の XML データ ファイル自体で、この形式を保持することになるでしょう (まだどちらかはわかりません)。

この種のテンプレート化を可能にする標準的なイディオムはありますか? 何か案は ?

ところで; データドキュメントには、もちろん作成するさまざまなユーザーが含まれています

4

2 に答える 2

2

AVT のアプローチは、私の好みにはちょっと悪すぎます。私は、(2.0 で) xsl:value-of: によって行われる暗黙的な連結に頼る傾向があります。

<xsl:value-of select="'CREATE USER', $username, 'identified by', $password"/>

この種のテキスト テンプレートが重要なアプリケーションで私が使用したもう 1 つのアプローチは、基本的に XSLT 内に独自のテンプレート エンジンを作成することです。フォームにメッセージ テンプレートを含む「メッセージ ファイル」がある

<message nr="1">CREATE USER <p:user/> IDENTIFIED BY <p:password/></message>

次に、パラメーターを置換してメッセージを展開するテンプレート ルールを記述します。

于 2012-11-27T22:34:52.653 に答える
1

@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}; &#10;[...]" />
  <q val="[...]CREATE TABLE {tablename}, blah blah; &#10;[...]" />
</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/

于 2012-11-27T21:26:11.203 に答える