Berikut adalah beberapa contoh apa yang dapat Anda lakukan dengan JSLT - JavaScript Lightweight Transforms (kecil [jslt.min.js] ) saya:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] beratnya ~ 3,1kb yang diperkecil )
yaitu, hanya satu fungsi,
function Per ( subject ) { ... }
... yang sebenarnya meniru model pemrosesan XSLT (1.0) .
(lih fungsi dalam "transform" dan "templat", di tubuh Per)
Jadi, pada dasarnya, itu hanya semua dimasukkan ke dalam single function Per ( subject ) { ... }
yang melakukan evaluasi pada jenis argumen uniknya, untuk diterapkan, baik:
1) Array subjek
pembuatan nodeset / filtering / perataan / pengelompokan / pemesanan / dll , jika subjek adalah array, di mana nodeset yang dihasilkan (juga Array ) diperluas dengan, dan terikat dengan metode yang sesuai ( hanya instance Array yang dikembalikan dari panggilan ke Per ( subjectArray )
adalah diperpanjang; yaitu, Array.prototype dibiarkan tak tersentuh)
yaitu, Per :: Array -->
Array
( metode ekstensi Array yang dihasilkan memiliki nama yang cukup jelas seperti, groupBy, orderBy, flattenBy, dll - lih. penggunaan dalam contoh-contoh)
2) Subjek string
interpolasi string , jika subjek adalah string
("Per" lalu mengembalikan objek dengan metode map ( source )
, yang terikat ke string templat subjek )
yaitu, Per :: String -->
{map :: ( AnyValue -->
String )}
misalnya,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
hasil:
"Hi honey, my name is Bond. James, Bond."
sementara salah satu dari
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
atau
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
menghasilkan yang sama:
"Those '0123456789' are our 10 digits."
tapi hanya
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
hasil panen
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Ubah subjek
XSLT mirip-transformasi , jika subjek adalah hash dengan anggota "$" yang didefinisikan secara konvensional menyediakan array aturan penulisan ulang (dan sama seperti dalam (2), "Per" kemudian mengembalikan objek dengan metode yang map ( source )
terikat pada subjek. mengubah - di mana
"ruleName" in Per ( subjectTransform [ , ruleName ])
adalah opsional dan menyediakan fungsionalitas yang mirip dengan <xsl: call-template name = "templateName"> ...)
yaitu, Per :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
dengan
Transform :: {$ :: Array aturan penulisan ulang [rw.r.] }
( [rw.r.] pasangan fungsi predikat dan templat)
misalnya, diberikan (... contoh lain yang dibuat-buat)
// (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);
}
]
//...
] };
kemudian
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
hasil:
{ "li": "John Smith (gender: Male)" }
sementara ... (mirip <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
hasil:
"James Bond... (his gender is Male)"
dan
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
hasil:
"Someone... (his/her gender is Male or Female)"
4) Sebaliknya
fungsi identitas , dalam semua kasus lainnya
yaitu, Per :: T -->
T
(yaitu, Per === function ( value ) { return value ; }
)
Catatan
pada (3) di atas, JavaScript "ini" di badan fungsi templat terikat dengan wadah / pemilik Transform dan seperangkat aturannya (sebagaimana didefinisikan oleh array $: [...]) - oleh karena itu, membuat ekspresi "Per (ini)", dalam konteks itu, setara fungsional-dekat dengan XSLT
<xsl:apply-templates select="..."/>
'HTH,