다음은 내 (작은 [jslt.min.js] ) JSLT-JavaScript Lightweight Transforms로 수행 할 수있는 작업의 몇 가지 예입니다 .
https://jsfiddle.net/YSharpLanguage/c7usrpsL/10
( [jslt.min.js] 무게 ~ 3.1kb 축소 )
즉, 하나의 기능 만
function Per ( subject ) { ... }
... 실제로 XSLT (1.0)의 처리 모델을 모방 합니다 .
(참조, Per의 신체에서 "변형"과 "템플릿"내부 기능)
본질적으로, 그것은 단지 하나의 모든 것에서 구워졌습니다 function Per ( subject ) { ... }
.
1) 배열 주제
노드 집합 생성 / 필터링 / 평탄화 / 그룹 / 정렬 / 등 , 피사체가 생성 노드 집합 (AN 배열이면 배열 뿐만 아니라)를 통해 확장하고, 따라서라는 메소드 (에 바인딩 만을 반환 배열 호출의 인스턴스 Per ( subjectArray )
되고 확장, 즉 Array.prototype은 그대로 유지됩니다)
즉, Per :: 배열 -->
배열
( groupBy, orderBy, flattenBy 등과 같은 자체 설명 이름을 갖는 결과 Array 의 확장 메소드-예제의 사용법 참조)
2) 문자열 주제
subject가 문자열 인 경우 문자열 보간
( "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의 "this"는 컨테이너 / 소유자 변환 및 규칙 세트 ($ : [...] 배열에 정의 된대로)에 바인딩됩니다. 따라서, 그러한 맥락에서 "Per (this)"라는 표현을 XSLT와 기능적으로 가까운
<xsl:apply-templates select="..."/>
'HTH,