Aquí hay algunos ejemplos de lo que puedes hacer con mi (pequeño [jslt.min.js] ) JSLT - JavaScript Lightweight Transforms:
enlace
( [jslt.min.js] pesa ~ 3.1kb minified )
es decir, solo una función,
function Per ( subject ) { ... }
... que en realidad imita a modelo de procesamiento de XSLT (1.0) .
(consulte las funciones internas de "transformación" y "plantilla", en el cuerpo de Per)
Entonces, en esencia, es simplemente todo integrado en ese único function Per ( subject ) { ... }
que resume su evaluación sobre el tipo de su (también) único argumento, para implementar, ya sea:
1) Array sujeto
creación / filtrado / aplanamiento / agrupamiento / pedido / etc del conjunto de nodos , si el sujeto es una matriz, donde el conjunto de nodos resultante (un Array también) se extiende con, y enlazado a los métodos nombrados en consecuencia ( solo la instancia devuelta Array de la llamada a Per ( subjectArray )
se extiende; es decir, Array.prototype se deja sin tocar)
es decir, Por :: Array -->
Array
(los métodos de extensión de Array resultantes tienen nombres que se explican por sí mismos como, groupBy, orderBy, flattenBy, etc. - consulte el uso en los ejemplos)
2) Cadena tema
interpolación de cadena , si el asunto es una cadena
("Per" luego devuelve un objeto con un método map ( source )
, que está enlazado al sujeto template cadena)
es decir, Por :: String -->
{map :: ( AnyValue -->
String )}
por ejemplo,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
rendimientos:
"Hi honey, my name is Bond. James, Bond."
mientras que cualquiera de
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
o
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
produce lo mismo:
"Those '0123456789' are our 10 digits."
pero solo
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
rendimientos
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Transformar tema
Transformación parecida a XSLT , si el tema es un hash con un miembro definido convencionalmente "$" que proporciona el conjunto de reglas de reescritura (y lo mismo que en ( 2), "Per" luego devuelve un objeto con un método map ( source )
enlazado a la transformación del sujeto - donde
"ruleName" en Per ( subjectTransform [ , ruleName ])
es opcional y proporciona una funcionalidad similar a < xsl: call-template name="templateName" > ...)
es decir, Per :: ( Transform [ ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
con
Transformar :: {$ :: Array de las reglas de reescritura [rw.r.] }
( [rw.r.] pares de función de predicado y plantilla)
por ejemplo, dado (... otro ejemplo artificial)
// (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);
}
]
//...
] };
entonces
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
rendimientos:
{ "li": "John Smith (gender: Male)" }
mientras que ... (muy parecido a <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
rendimientos:
"James Bond... (his gender is Male)"
y
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
rendimientos:
"Someone... (his/her gender is Male or Female)"
4) De lo contrario
la función de identidad , en todos los demás casos
es decir, Por :: T -->
T
(es decir, Per === function ( value ) { return value ; }
)
Nota
en (3) arriba, un "esto" de JavaScript en el cuerpo de una función de plantilla está vinculado al contenedor / propietario Transform y su conjunto de reglas (como se define en $: [ ...] array) - por lo tanto, haciendo de la expresión "Per (this)", en ese contexto, un equivalente funcionalmente cercano al de XSLT
<xsl:apply-templates select="..."/>
'HTH,