นี่คือตัวอย่างเล็ก ๆ น้อย ๆ ของสิ่งที่คุณสามารถทำได้กับ ( jslt.min.js ) ขนาดเล็กของฉันJSLT - JavaScript Lightweight Transforms:
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js]น้ำหนัก ~ 3.1kb ย่อขนาด )
นั่นคือเพียงฟังก์ชั่นเดียว
function Per ( subject ) { ... }
... ซึ่งอันที่จริงเลียนแบบXSLT (1.0) 's รูปแบบการประมวลผล
(เปรียบเทียบฟังก์ชันภายในของ "การแปลง" และ "แม่แบบ" ในเนื้อหาของ Per)
ดังนั้นในสาระสำคัญมันเป็นเพียงการอบเข้าสู่ซิงเกิ้ลเท่านั้นfunction Per ( subject ) { ... }
ซึ่งจะทำการประเมินในรูปแบบของอาร์กิวเมนต์ที่ไม่ซ้ำกัน (เช่น) เพื่อนำไปใช้:
1) เรื่องของอาร์เรย์
สร้าง nodeset / กรอง / แฟบ / การจัดกลุ่ม / สั่งซื้อ / etcถ้าเรื่องเป็นอาร์เรย์ที่ nodeset ส่งผล (เป็นอาร์เรย์เช่นกัน) จะขยายออกไปด้วยและผูกพันกับวิธีการตั้งชื่อตาม ( เพียงกลับอาร์เรย์ตัวอย่างของการเรียกร้องให้Per ( subjectArray )
มี Extended; คือ Array.prototype ถูกปล่อยไว้โดยไม่ถูกแตะต้อง)
เช่นต่อ :: Array -->
Array
( เมธอดส่วนขยายของArray ที่ได้นั้นมีชื่อที่อธิบายตนเองเช่น groupBy, orderBy, flattenBy ฯลฯ - cf. การใช้งานในตัวอย่าง)
2) หัวเรื่องของสตริง
การแก้ไขสตริงหากหัวเรื่องเป็นสตริง
("ต่อ" แล้วส่งคืนวัตถุที่มีวิธีการmap ( source )
ซึ่งถูกผูกไว้กับสตริงแม่แบบเรื่อง)
ie, 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), "ต่อ" แล้วส่งกลับวัตถุที่มีวิธีการmap ( source )
ที่ถูกผูกไว้กับเรื่อง แปลง - ที่ไหน
"ruleName" in Per ( subjectTransform [ , ruleName ])
เป็นทางเลือกและมีฟังก์ชันการทำงานที่คล้ายกับ <xsl: call-template name = "templateName"> ... )
เช่นต่อ :: ( เปลี่ยน [, 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) มิฉะนั้น
ฟังก์ชั่นตัวตนในกรณีอื่น ๆ ทั้งหมด
เช่นต่อ :: T -->
T
(เช่นPer === function ( value ) { return value ; }
)
บันทึก
ใน (3) ด้านบน JavaScript ของ "นี่" ในส่วนของฟังก์ชันเทมเพลตจึงถูกผูกไว้กับการแปลงคอนเทนเนอร์ / เจ้าของและชุดของกฎ (ตามที่กำหนดโดยอาร์เรย์ $: [... ]) - ดังนั้น ทำให้นิพจน์ "Per (this)" ในบริบทนั้นเทียบเท่ากับ XSLT ของ functionally
<xsl:apply-templates select="..."/>
'HTH,