Вот несколько примеров того, что вы можете сделать с моим (small [jslt.min.js] ) JSLT - JavaScript Lightweight Transforms:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] весит ~ 3,1 кб минимизировано )
то есть только одна функция,
function Per ( subject ) { ... }
... которая фактически имитирует модель обработки XSLT (1.0) .
(см. внутренние функции "transform" и "template" в теле Пера)
Так что, по сути, это просто все, что встроено в тот единственный, function Per ( subject ) { ... }
который выполняет оценку по типу своего (также) уникального аргумента, чтобы реализовать либо:
1) Массив субъект
Создание набора узлов / фильтрация / уплощение / Группировка / упорядочение / и т.д. , если объект является массив, в котором результирующий набор узлы (ый массив , а) продолжаются с, и связаны с методами , названных соответствующим образом ( только возвращаемым массивом экземпляром вызова Per ( subjectArray )
IS расширенный, т. е. Array.prototype остается нетронутым)
то есть, Per :: Array -->
Array
(результирующие методы расширения Array , имеющие понятные имена, такие как groupBy, orderBy, flattenBy и т. д. - см. использование в примерах)
2) Строковый предмет
интерполяция строки , если тема является строкой
(«Per» затем возвращает объект с методом map ( source )
, который привязан к строке шаблона темы )
т.е. Per :: String -->
{map :: ( AnyValue -->
String )}
например,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
выходы:
"Hi honey, my name is Bond. James, Bond."
в то время как любой из
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
или
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
дает то же самое:
"Those '0123456789' are our 10 digits."
но только
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
доходность
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Преобразовать тему
XSLT-преобразование в стиле « похожий» , если субъект представляет собой хеш с условно определенным элементом «$», предоставляющим массив правил перезаписи (и, как и в (2), «Per» затем возвращает объект с методом, map ( source )
привязанным к субъекту). преобразовать - где
«ruleName» в Per ( subjectTransform [ , ruleName ])
необязательно и обеспечивает функциональность, аналогичную <xsl: call-template name = "templateName"> ...)
т.е. Per :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
с
Transform :: {$ :: Массив правил переписывания [rw.r.] }
( [rw.r.] пары предикатов и шаблонных функций)
например, данный (... другой надуманный пример)
// (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);
}
]
//...
] };
тогда
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
выходы:
{ "li": "John Smith (gender: Male)" }
в то время как ... (очень похоже <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
выходы:
"James Bond... (his gender is Male)"
и
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
выходы:
"Someone... (his/her gender is Male or Female)"
4) В противном случае
функция тождества во всех остальных случаях
то есть, Per :: T -->
T
(т.е. Per === function ( value ) { return value ; }
)
Заметка
в (3) выше JavaScript «this» в теле функции шаблона, таким образом, связан с контейнером / владельцем Transform и его набором правил (как определено массивом $: [...]) - поэтому делая выражение «Per (this)», в этом контексте, функционально близким эквивалентом XSLT
<xsl:apply-templates select="..."/>
«НТН,