Voici quelques exemples de ce que vous pouvez faire avec mon (petit [jslt.min.js] ) JSLT - Transformations légères JavaScript:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] pèse ~ 3,1 ko minifié )
c'est-à-dire une seule fonction,
function Per ( subject ) { ... }
... qui imite en fait le modèle de traitement de XSLT (1.0) .
(cf. les fonctions internes "transform" et "template", dans le corps de Per)
Donc, en substance, c'est tout simplement tout cuit dans ce single function Per ( subject ) { ... }
qui forge son évaluation sur le type de son argument (également) unique, à implémenter, soit:
1) Sujet du tableau
création / filtrage de l'ensemble de nœuds / aplatissement / regroupement / classement / etc , si l'objet est un tableau, où l'ensemble de nœuds résultant (un tableau également) est étendu avec et lié aux méthodes nommées en conséquence ( seule l' instance de tableau renvoyée de l'appel à Per ( subjectArray )
est étendu; c.-à-d., Array.prototype n'est pas modifié)
c'est-à-dire Per :: Array -->
Array
(les méthodes d'extension du tableau résultant ayant des noms explicites tels que, groupBy, orderBy, flattenBy, etc. - cf. l'utilisation dans les exemples)
2) Sujet de chaîne
interpolation de chaîne , si le sujet est une chaîne
("Per" renvoie ensuite un objet avec une méthode map ( source )
, qui est liée à la chaîne de modèle objet )
c'est-à-dire, Per :: String -->
{map :: ( AnyValue -->
String )}
par exemple,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
rendements:
"Hi honey, my name is Bond. James, Bond."
tandis que
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
ou
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
donne le même:
"Those '0123456789' are our 10 digits."
mais, seulement
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
les rendements
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Transformer le sujet
Transformation similaire à XSLT , si le sujet est un hachage avec un membre "$" défini de manière conventionnelle fournissant le tableau de règles de réécriture (et comme dans (2), "Per" renvoie ensuite un objet avec une méthode map ( source )
liée au sujet transformer - où
"ruleName" dans Per ( subjectTransform [ , ruleName ])
est facultatif et fournit des fonctionnalités similaires à <xsl: call-template name = "templateName"> ...)
c'est-à-dire Per :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
avec
Transform :: {$ :: Tableau de règles de réécriture [rw.r.] }
( [rw.r.] paires de fonctions prédicat et modèle)
par exemple, étant donné (... un autre exemple artificiel)
// (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);
}
]
//...
] };
ensuite
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
rendements:
{ "li": "John Smith (gender: Male)" }
tandis que ... (très semblable <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
rendements:
"James Bond... (his gender is Male)"
et
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
rendements:
"Someone... (his/her gender is Male or Female)"
4) Sinon
la fonction d'identité , dans tous les autres cas
c'est-à-dire Per :: T -->
T
(c.-à-d. Per === function ( value ) { return value ; }
)
Remarque
dans (3) ci-dessus, le "this" d'un JavaScript dans le corps d'une fonction de modèle est donc lié à la transformation conteneur / propriétaire et à son ensemble de règles (tel que défini par le tableau $: [...]) - donc, faisant de l'expression "Per (this)", dans ce contexte, un équivalent fonctionnellement proche des XSLT
<xsl:apply-templates select="..."/>
«HTH,