Hier einige Beispiele, was Sie mit meinem (kleinen [jslt.min.js] ) JSLT - JavaScript Lightweight Transforms machen können:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] wiegt ~ 3,1 kb, minimiert )
das heißt, nur eine Funktion,
function Per ( subject ) { ... }
... die tatsächlich das Verarbeitungsmodell von XSLT (1.0) nachahmt .
(Vgl. die inneren Funktionen "Transformieren" und "Schablonen" in Per's Körper)
Im Grunde genommen ist es also einfach alles in diese Single function Per ( subject ) { ... }
eingebettet, die ihre Bewertung nach der Art ihres (auch) einzigartigen Arguments veranlasst, um Folgendes zu implementieren:
1) Array- Betreff
Knotensatzerstellung / -filterung / -reduzierung / -gruppierung / -reihenfolge / etc , wenn subject ein Array ist, mit dem der resultierende Knotensatz (auch ein Array ) erweitert und an entsprechend benannte Methoden gebunden wird ( nur die zurückgegebene Array- Instanz des Aufrufs an Per ( subjectArray )
ist) erweitert (dh Array.prototype bleibt unangetastet)
dh Per :: Array -->
Array
(Die Erweiterungsmethoden des resultierenden Arrays haben selbsterklärende Namen wie groupBy, orderBy, flattenBy usw. - siehe die Verwendung in den Beispielen.)
2) Betreff der Zeichenfolge
String-Interpolation , wenn subject ein String ist
( „Pro“ , dann gibt ein Objekt mit einem Verfahren map ( source )
, das das Subjekt gebunden ist template string)
dh Per :: String -->
{map :: ( AnyValue -->
String )}
z.B,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
ergibt:
"Hi honey, my name is Bond. James, Bond."
während einer von
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
oder
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
ergibt das gleiche:
"Those '0123456789' are our 10 digits."
aber nur
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
Ausbeuten
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Betreff transformieren
XSLT-Look-Alike-Transformation , wenn das Thema ein Hash mit a ist konventionell definierten "$" -Mitglied ist, das das Array von Umschreiberegeln bereitstellt (und dasselbe wie in (2), gibt "Per" ein Objekt mit einer map ( source )
an das Subjekt gebundenen Methode zurück transformieren - wo
"ruleName" in Per ( subjectTransform [ , ruleName ])
ist optional und bietet eine ähnliche Funktionalität wie <xsl: call-template name = "templateName"> ...)
dh Per :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
mit
Transform :: {$ :: Array von Umschreiberegeln [rw.r.] }
( [rw.r.] Prädikat- und Template-Funktionspaare)
zB gegeben (... ein anderes erfundenes Beispiel)
// (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);
}
]
//...
] };
dann
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
ergibt:
{ "li": "John Smith (gender: Male)" }
während ... (sehr ähnlich <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
ergibt:
"James Bond... (his gender is Male)"
und
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
ergibt:
"Someone... (his/her gender is Male or Female)"
4) Sonst
die Identitätsfunktion , in allen anderen Fällen
dh Per :: T -->
T
(dh Per === function ( value ) { return value ; }
)
Hinweis
In (3) oben ist das "this" eines JavaScript im Rumpf einer Template-Funktion somit an die Container / Eigentümer- Transformation und deren Regelsatz (wie durch das Array $: [...] definiert) gebunden. den Ausdruck "Per (this)" in diesem Zusammenhang zu einem funktionsnahen Äquivalent zu XSLTs zu machen
<xsl:apply-templates select="..."/>
"HTH,