ここに、私の(small [jslt.min.js])JSLT-JavaScript Lightweight Transformsでできることの例をいくつか示します。
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
([jslt.min.js]の重量は〜3.1kb縮小されます)
つまり、ただ1つの関数、
function Per ( subject ) { ... }
...これは実際にXSLT(1.0)の処理モデルを模倣しています。
(Perの本文の「変換」および「テンプレート」内部関数を参照)
そのため、本質的には、その単一のすべてに単純に焼き付けられfunction Per ( subject ) { ... }
、その一意の引数のタイプの評価をフォークして、以下のいずれかを実装します。
1)配列サブジェクト
ノードセットの作成/フィルタリング/平坦化/グループ/順序/など、被験者は、得られるノード集合(配列である場合、配列同様)を(で拡張し、それに応じて名前のメソッドにバインドされているだけ戻さアレイへのコールのインスタンスPer ( subjectArray )
IS拡張;つまり、Array.prototypeは変更されません)
すなわち、Per :: Array -->
Array
(groupBy、orderBy、flattenByなどのわかりやすい名前を持つArrayの拡張メソッド-例の使用法を参照)
2)ストリング件名
件名が文字列の場合、文字列補間
(「Per」はmap ( source )
、サブジェクトテンプレート文字列にバインドされたmethodを持つオブジェクトを返します)
すなわち、Per :: String -->
{map : :(AnyValue -->
String)}
例えば、
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
収量:
"Hi honey, my name is Bond. James, Bond."
どちらかの
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
または
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
同じ結果が得られます。
"Those '0123456789' are our 10 digits."
だけ
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
利回り
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3)サブジェクトの変換
XSLTの類似変換。サブジェクトが、従来のように定義された書き換え規則の配列を提供する「$」メンバーを持つハッシュである場合(および(2)と同じ)、「Per」はmap ( source )
、サブジェクトにバインドされたメソッドを持つオブジェクトを返します変換-どこ
「ruleName」Per ( subjectTransform [ , ruleName ])
はオプションであり、<xsl:call-template name = "templateName"> ...と同様の機能を提供します。
すなわち、Per : :(Transform [、ruleName :: String ])-->
{map : :( -->
AnyValue AnyValue)}
と
変換 :: {$ :: 書き換えルールの配列[rw.r.] }
([rw.r.]述語とテンプレート関数のペア)
例えば、与えられた(...他の不自然な例)
// (A "Member" must have first and last names, and a gender)
function Member(obj) {
return obj.first && obj.last && obj.sex;
}
var a_transform = { $: [
//...
[ [ Member ], // (alike <xsl:template match="...">...)
function(member) {
return {
li: Per("{first} {last}").map(member) +
" " +
Per(this).map({ gender: member.sex })
};
}
],
[ [ function(info) { return info.gender; } ], // (alike <xsl:template match="...">...)
function(info) { return Per("(gender: {gender})").map(info); }
],
[ [ "betterGenderString" ], // (alike <xsl:template name="betterGenderString">...)
function(info) {
info.pronoun = info.pronoun || "his/her";
return Per("({pronoun} gender is {gender})").map(info);
}
]
//...
] };
それから
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
収量:
{ "li": "John Smith (gender: Male)" }
while ...(ほとんど同じ<xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
収量:
"James Bond... (his gender is Male)"
そして
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
収量:
"Someone... (his/her gender is Male or Female)"
4)そうでなければ
アイデンティティ関数、他のすべての場合
すなわち、Per :: T -->
T
(すなわちPer === function ( value ) { return value ; }
)
注意
上記の(3)で、テンプレート関数の本文にあるJavaScriptの「this」は、コンテナー/所有者変換とそのルールセット($:[...]配列で定義されている)にバインドされているため、そのコンテキストで、式「Per(this)」をXSLTと同等の機能的に近いものにする
<xsl:apply-templates select="..."/>
'HTH、