Dưới đây là một vài ví dụ về những gì bạn có thể làm với ( [jslt.min.js] ) nhỏ của tôi - JavaScript Biến đổi nhẹ:
https://jsfiddle.net/YSharpL Language / c7usrpsL/10
( [jslt.min.js] nặng ~ 3,1kb )
đó là, chỉ một chức năng,
function Per ( subject ) { ... }
... mà thực sự bắt chước mô hình xử lý của XSLT (1.0) .
(xem các hàm bên trong "biến đổi" và "mẫu", trong cơ thể của Per)
Vì vậy, về bản chất, nó chỉ đơn giản là tất cả được đưa vào một đĩa đơn function Per ( subject ) { ... }
mà từ đó đánh giá nó về loại đối số duy nhất (cũng) của nó, để thực hiện, hoặc:
1) Chủ đề mảng
tạo nodeset / lọc / phẳng / nhóm / đặt hàng / etc , nếu đối tượng là một mảng, nơi nodeset kết quả (một mảng cũng) được mở rộng với, và bị ràng buộc với các phương pháp đặt tên cho phù hợp ( chỉ trả về mảng thể hiện của các cuộc gọi đến Per ( subjectArray )
là mở rộng; tức là Array.prototype không được chạm tới)
tức là, Per :: Array -->
Array
(các phương thức mở rộng của Mảng kết quả có các tên tự giải thích, chẳng hạn như groupBy, orderBy, flattenBy, v.v. - xem cách sử dụng trong các ví dụ)
2) Chủ đề chuỗi
nội suy chuỗi , nếu chủ đề là một chuỗi
("Per" sau đó trả về một đối tượng bằng một phương thức map ( source )
, được liên kết với chuỗi mẫu chủ đề )
tức là Per :: String -->
{map :: ( AnyValue -->
String )}
ví dụ,
Per("Hi honey, my name is {last}. {first}, {last}.").map({ "first": "James", "last": "Bond" })
sản lượng:
"Hi honey, my name is Bond. James, Bond."
trong khi một trong hai
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
hoặc là
Per("Those '{*}' are our 10 digits.").map(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
năng suất như nhau:
"Those '0123456789' are our 10 digits."
nhưng chỉ
Per("Those '{*}' are our 10 digits.").map([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], ", ")
sản lượng
"Those '0, 1, 2, 3, 4, 5, 6, 7, 8, 9' are our 10 digits."
3) Chuyển đổi chủ đề
Phép biến đổi trông giống XSLT , nếu đối tượng là hàm băm với thành viên "$" được quy định theo quy ước, cung cấp mảng quy tắc viết lại (và giống như trong (2), "Per" sau đó trả về một đối tượng có phương thức được map ( source )
liên kết với chủ thể biến đổi - nơi
"ruleName" trong Per ( subjectTransform [ , ruleName ])
là tùy chọn và cung cấp chức năng tương tự như <xsl: call-template name = "templateName"> ...)
tức là Per :: ( Transform [, ruleName :: String ]) -->
{map :: ( AnyValue -->
AnyValue )}
với
Transform :: {$ :: Mảng quy tắc viết lại [rw.r.] }
( [rw.r.] cặp chức năng vị ngữ và mẫu)
ví dụ: được đưa ra (... một ví dụ khác)
// (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);
}
]
//...
] };
sau đó
Per(a_transform).map({ "first": "John", "last": "Smith", "sex": "Male" })
sản lượng:
{ "li": "John Smith (gender: Male)" }
trong khi ... (rất giống nhau <xsl:call-template name="betterGenderString">...
)
"James Bond... " +
Per(a_transform, "betterGenderString").map({ "pronoun": "his", "gender": "Male" })
sản lượng:
"James Bond... (his gender is Male)"
và
"Someone... " +
Per(a_transform, "betterGenderString").map({ "gender": "Male or Female" })
sản lượng:
"Someone... (his/her gender is Male or Female)"
4) Mặt khác
chức năng nhận dạng , trong tất cả các trường hợp khác
tức là Per :: T -->
T
(tức là Per === function ( value ) { return value ; }
)
Ghi chú
trong (3) ở trên, "cái này" của JavaScript trong phần thân của hàm khuôn mẫu do đó bị ràng buộc với Biến đổi bộ chứa / chủ sở hữu và bộ quy tắc của nó (như được định nghĩa bởi mảng $: [...]) - do đó, làm cho biểu thức "Per (this)", trong bối cảnh đó, tương đương về mặt chức năng với XSLT
<xsl:apply-templates select="..."/>
'HTH,