Aqui estão alguns exemplos do que você pode fazer com o meu (small [jslt.min.js] ) JSLT - JavaScript Lightweight Transforms:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] pesa ~ 3.1kb reduzido )
isto é, apenas uma função,
function Per ( subject ) { ... }
... que realmente imita o modelo de processamento do XSLT (1.0) .
(cf. as funções internas "transformar" e "modelo", no corpo de Per)
Portanto, em essência, é simplesmente tudo incluído naquele single function Per ( subject ) { ... }
que bifurca sua avaliação no tipo de seu (também) argumento único, para implementar:
1) Assunto da matriz
criação / filtragem de conjunto de nós / filtragem / nivelamento / agrupamento / pedido / etc , se o assunto for uma matriz, em que o conjunto de nós resultante (também uma matriz ) é estendido e vinculado a métodos nomeados de acordo ( apenas a instância de matriz retornada da chamada para Per ( subjectArray )
é estendido; ou seja, Array.prototype permanece intocado)
ou seja, Per :: Array -->
Array
(os métodos de extensão da matriz resultantes com nomes auto-explicativos, como groupBy, orderBy, flattenBy, etc. - consulte o uso nos exemplos)
2) Assunto da string
interpolação de string , se o assunto for uma string
("Per" retorna um objeto com um método map ( source )
, que é vinculado à sequência do modelo do assunto )
ou seja, Per :: String -->
{map :: ( AnyValue -->
String )}
por exemplo,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
rendimentos:
"Hi honey, my name is Bond. James, Bond."
enquanto qualquer um
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)
produz o mesmo:
"Those '0123456789' are our 10 digits."
se apenas
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
rendimentos
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Transformar assunto
Transformação semelhante XSLT , se o assunto for um hash com um membro "$" definido convencionalmente, fornecendo a matriz de regras de reescrita (e mesmo que em (2), "Per" retornará um objeto com um método map ( source )
vinculado ao assunto transformar - onde
"ruleName" in Per ( subjectTransform [ , ruleName ])
é opcional e fornece funcionalidade semelhante a <xsl: call-template name = "templateName"> ...)
ou seja, Por :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
com
Transform :: {$ :: Matriz de regras de reescrita [rw.r.] }
( [rw.r.] pares de funções de predicado e modelo)
por exemplo, dado (... outro exemplo 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);
}
]
//...
] };
então
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
rendimentos:
{ "li": "John Smith (gender: Male)" }
enquanto ... (muito parecido <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
rendimentos:
"James Bond... (his gender is Male)"
e
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
rendimentos:
"Someone... (his/her gender is Male or Female)"
4) Caso contrário
a função de identidade , em todos os outros casos
ou seja, Per :: T -->
T
(ie Per === function ( value ) { return value ; }
)
Nota
em (3) acima, o "this" de um JavaScript no corpo de uma função de template está vinculado à transformação container / owner e seu conjunto de regras (conforme definido pela matriz $: [...]) - portanto, tornando a expressão "Per (this)", nesse contexto, um equivalente funcionalmente próximo aos XSLT's
<xsl:apply-templates select="..."/>
«HTH,