Ось кілька прикладів того, що ви можете зробити з моїм (малим [jslt.min.js] ) JSLT - полегшеними перетвореннями JavaScript:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] важить ~ 3,1 кбіт мінімізовано )
тобто лише одна функція,
function Per ( subject ) { ... }
... що наслідує модель обробки XSLT (1.0) .
(пор. внутрішні функції "перетворення" та "шаблон" у тілі Пер)
Таким чином, по суті, це просто все, що вкладається в той сингл, function Per ( subject ) { ... }
який формує свою оцінку за типом свого (також) унікального аргументу, щоб реалізувати:
1) Тема масиву
Створення набору вузлів / фільтрація / уплощение / Угруповання / впорядкування / і т.д. , якщо об'єкт є масив, в якому результуючий набір вузли (ий масив , а) тривають с, і пов'язані з методами , названих відповідним чином ( тільки повертається масивом екземпляром виклику Per ( subjectArray )
IS розширено; тобто Array.prototype залишається недоторканим)
тобто Per :: 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 )}
з
Трансформація :: {$ :: Масив правил переписування [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 "це" в тілі функції шаблону, таким чином, пов'язаний з контейнером / власником Transform та його набором правил (як визначено масивом $: [...]) - отже, роблячи вираз "Per (this)" у цьому контексті функціонально близьким еквівалентом XSLT
<xsl:apply-templates select="..."/>
'HTH,