Oto kilka przykładów tego, co możesz zrobić z moim (małym [jslt.min.js] ) JSLT - JavaScript Lightweight Transforms:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] waży ~ ok. 3,1kb )
to jest tylko jedna funkcja,
function Per ( subject ) { ... }
... który faktycznie naśladuje model przetwarzania XSLT (1.0) .
(por. funkcje wewnętrzne „transformacji” i „szablonu” w ciele Pera)
Zasadniczo jest to po prostu wszystko upieczone w tym singlu, function Per ( subject ) { ... }
który wymaga oceny swojego (także) unikalnego argumentu, który można zaimplementować:
1) Tablica przedmiotem
tworzenie zestawów węzłów / filtrowanie / spłaszczanie / grupowanie / porządkowanie / itp. , jeśli podmiot jest tablicą, w której wynikowy zestaw węzłów (także tablica ) jest rozszerzany i powiązany z metodami odpowiednio nazwanymi ( tylko zwrócona instancja Array wywołania Per ( subjectArray )
to rozszerzony, tj. Array.prototype pozostaje nietknięty)
tj. Per :: Array -->
Array
(wynikowe metody rozszerzenia macierzy posiadające zrozumiałe nazwy, takie jak groupBy, orderBy, flattenBy itp. - por. użycie w przykładach)
2) Temat łańcucha
interpolacja łańcucha , jeśli temat jest łańcuchem
(„Per” następnie zwraca obiekt metodą map ( source )
, która jest powiązana z ciągiem szablonu tematu )
tj. Per :: String -->
{map :: ( AnyValue -->
String )}
na przykład,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
daje:
"Hi honey, my name is Bond. James, Bond."
podczas gdy którykolwiek z
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
lub
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
daje to samo:
"Those '0123456789' are our 10 digits."
lecz tylko
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
daje
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Przekształć temat
Transformacja podobna do XSLT , jeśli podmiot jest skrótem z konwencjonalnie zdefiniowanym elementem „$” zapewniającym tablicę reguł przepisywania (i tak samo jak w (2), „Per” następnie zwraca obiekt metodą map ( source )
powiązaną z podmiotem przekształcać - gdzie
„nazwa_zasady” w Per ( subjectTransform [ , ruleName ])
jest opcjonalna i zapewnia funkcjonalność podobną do <xsl: call-template name = „templateName”> ...)
tj. Per :: ( Przekształć [, nazwa_zasady :: Ciąg ]) -->
{map :: ( AnyValue -->
AnyValue )}
z
Przekształć :: {$ :: Tablica reguł przepisywania [rw.r.] }
( [rw.r.] pary predykatów i funkcji szablonów)
np. podany (... inny wymyślony przykład)
// (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);
}
]
//...
] };
następnie
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
daje:
{ "li": "John Smith (gender: Male)" }
podczas gdy ... (podobnie <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
daje:
"James Bond... (his gender is Male)"
i
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
daje:
"Someone... (his/her gender is Male or Female)"
4) W przeciwnym razie
funkcja tożsamości we wszystkich innych przypadkach
tj. Per :: T -->
T
(tj. Per === function ( value ) { return value ; }
)
Uwaga
w (3) powyżej, JavaScript „to” w treści funkcji szablonu jest w ten sposób związany z transformatorem kontenera / właściciela i jego zestawem reguł (zgodnie z tablicą $: [...]) - dlatego też dzięki czemu wyrażenie „Per (this)” w tym kontekście jest funkcjonalnie blisko równoważne z XSLT
<xsl:apply-templates select="..."/>
„HTH,