Aquí hay algunos ejemplos de lo que puede hacer con mi (pequeño [jslt.min.js] ) JSLT - Transformaciones ligeras de JavaScript:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] pesa ~ 3.1kb minificado )
es decir, solo una función,
function Per ( subject ) { ... }
... que realmente imita el modelo de procesamiento de XSLT (1.0) .
(cf. las funciones internas "transformar" y "plantilla", en el cuerpo de Per)
Entonces, en esencia, simplemente se integra todo en ese único function Per ( subject ) { ... }
que bifurca su evaluación sobre el tipo de su (también) argumento único, para implementar, ya sea:
1) Asunto de la matriz
creación / filtrado / aplanamiento / agrupación / ordenación / conjunto de nodos, si el sujeto es una matriz, donde el conjunto de nodos resultante (también una matriz ) se amplía y se vincula a los métodos nombrados en consecuencia ( solo la instancia de matriz devuelta de la llamada Per ( subjectArray )
es extendido; es decir, Array.prototype se deja intacto)
es decir, Per :: Array -->
Array
(los métodos de extensión de la matriz resultante tienen nombres que se explican por sí mismos, como groupBy, orderBy, flattenBy, etc., véase el uso en los ejemplos)
2) Asunto de cuerda
interpolación de cadenas , si el sujeto es una cadena
("Por" luego devuelve un objeto con un método map ( source )
, que está vinculado a la cadena de plantilla del asunto )
es decir, Per :: String -->
{map :: ( AnyValue -->
String )}
p.ej,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
rendimientos:
"Hi honey, my name is Bond. James, Bond."
mientras 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 sólo
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 sujeto
Transformación similar a XSLT , si el sujeto es un hash con un miembro "$" convencionalmente definido que proporciona la matriz de reglas de reescritura (e igual que en (2), "Per" luego devuelve un objeto con un método map ( source )
vinculado al sujeto transformar - donde
"ruleName" en Per ( subjectTransform [ , ruleName ])
es opcional y proporciona una funcionalidad similar a <xsl: nombre de la llamada-template = "nombre_plantilla"> ...)
es decir, Per :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
con
Transformar :: {$ :: Matriz de reescritura de reglas [rw.r.] }
( pares de funciones de predicado y plantilla [rw.r.] )
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);
}
]
//...
] };
luego
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
rendimientos:
{ "li": "John Smith (gender: Male)" }
mientras ... (muy parecido <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, Per :: T -->
T
(es decir, Per === function ( value ) { return value ; }
)
Nota
en (3) arriba, un "this" 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 la matriz $: [...]) - por lo tanto, haciendo la expresión "Per (this)", en ese contexto, un equivalente funcionalmente cercano a XSLT
<xsl:apply-templates select="..."/>
«HTH