İşte benim (small [jslt.min.js] ) JSLT ile yapabileceklerinize birkaç örnek : JavaScript Hafif Dönüşümler:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] ~ 3,1 kb küçültülmüş )
yani sadece bir işlev,
function Per ( subject ) { ... }
... aslında XSLT (1.0) 'ın işleme modelini taklit ediyor .
(bkz. Per'in gövdesinde "dönüştürme" ve "şablon" iç fonksiyonları)
Yani, özünde, basitçe, hepsi function Per ( subject ) { ... }
de (aynı zamanda) benzersiz argümanının türüne ilişkin değerlendirmesini çağıran, o ikisine de pişirilir :
1) Dizi konusu
nodeset oluşturma / süzme / düzleşme / gruplama / sipariş / vs. , söz konusu elde edilen nodeset (örneğin, bir dizi, eğer Dizi sıra) ile uzatılabilir ve buna göre adlandırılır yöntemler (bağlı olduğu sadece geri Dizi çağrısı örneği Per ( subjectArray )
IS genişletilmiş; yani, Array.prototype dokunulmaz)
yani, Per :: Dizi -->
Dizi
(Elde Array - örneklerde kullanım karşılaştırınız uzantısıdır yöntemleri, vb GroupBy, orderBy, flattenBy, hem kendini açıklayan adları olan)
2) Dize konusu
Konu bir dize ise dize enterpolasyonu
("Per" daha sonra map ( source )
, konu şablon dizesine bağlı bir yöntemle bir nesne döndürür )
yani, Per :: String -->
{map :: ( AnyValue -->
String )}
Örneğin,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
verim:
"Hi honey, my name is Bond. James, Bond."
ikisinden biri
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
veya
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
aynı verir:
"Those '0123456789' are our 10 digits."
ama yalnızca
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
verim
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Konuyu dönüştür
XSLT benzeri dönüşüm , eğer özne, yeniden yazma kuralları dizisini sağlayan geleneksel olarak tanımlanmış bir "$" üyesi olan bir karma ise (ve (2) 'de olduğu gibi, "Per" daha sonra nesneye map ( source )
bağlı bir yöntemle bir nesne döndürür dönüştür - nerede
"ruleName" Per ( subjectTransform [ , ruleName ])
, isteğe bağlıdır ve <xsl: call-template name = "templateName"> ... benzeri işlevler sağlar)
yani, Per :: ( Dönüştür [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
ile
Dönüşüm :: {$ :: Yeniden yazma kuralları dizisi [rw.r.] }
( [rw.r.] yüklem ve şablon işlev çiftleri)
örneğin, verilen (... başka bir örnek)
// (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);
}
]
//...
] };
sonra
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
verim:
{ "li": "John Smith (gender: Male)" }
süre ... (çok benzer <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
verim:
"James Bond... (his gender is Male)"
ve
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
verim:
"Someone... (his/her gender is Male or Female)"
4) Aksi takdirde
kimlik fonksiyonu , diğer tüm durumlarda
yani, Per :: T -->
T
(yani, Per === function ( value ) { return value ; }
)
Not
yukarıdaki (3) 'te, bir şablon işlevinin gövdesindeki bir JavaScript'in "bu" ifadesi bu nedenle kapsayıcıya / sahip Transform'a ve kural kümesine ($: [...] dizisi tarafından tanımlandığı gibi) bağlıdır - bu nedenle, "Per (this)" ifadesini bu bağlamda, XSLT'lere işlevsel olarak yakın bir eşdeğer yapmak
<xsl:apply-templates select="..."/>
'HTH,