XSLT는 JSON에 상당합니다.
JSON에 상당하는 XSLT가 있습니까?XSLT에서 XML로 변환하는 것처럼 JSON에서 변환을 수행할 수 있습니다.
JSON용 XSLT 동등품 - 후보 목록(도구 및 사양)
도구들
1. XSLT
Fn:json-to-xml을 목적으로 XSLT for JSON을 사용할 수 있습니다.
여기에서는 XSLT를 사용하여 JSON 데이터를 처리할 수 있는 기능에 대해 설명합니다.
2. jq
jq는 JSON 데이터용 sed와 비슷합니다. sed, awk, grep 및 친구들이 텍스트를 가지고 놀 수 있는 것처럼 쉽게 구조화된 데이터를 슬라이스, 필터링, 매핑 및 변환할 수 있습니다.다른 OS용 설치 패키지가 있습니다.
3. JJ
JJ는 JSON 문서에서 값을 가져오거나 업데이트하는 빠르고 간단한 방법을 제공하는 명령줄 유틸리티입니다.후드 밑에 GJSON과 SJSON이 동력을 공급하고 있습니다.
4. fx
명령줄 JSON 처리 도구
- 새로운 구문을 배울 필요가 없다
- 플레인 자바스크립트
- 포맷 및 강조 표시
- 스탠드아론 바이너리
5. CsvCruncher
명령줄 표 형식의 데이터 SQL 기반 처리 도구
- 새로운 구문을 배울 필요가 없다
- JSON에 유사한 항목을 포함하는 대규모 어레이가 포함되어 있는 경우에 적합합니다.
- 여러 문서를 여러 SQL 테이블로 처리할 수 있습니다.
- Kotlin으로 작성되어 Java에서 실행
- Maven Central 저장소에서 Java 라이브러리로도 사용 가능
6. jl
jl(JSON lamda)은 JSON을 쿼리 및 조작하기 위한 작은 기능 언어입니다.
7. 흔들리다
JSON에서 JSON으로 변환 라이브러리는 Java로 작성되며 변환의 "사양"은 JSON 문서입니다.
8. gron
JSON을 greppable로! gron은 JSON을 개별 할당으로 변환하여 원하는 것을 쉽게 grep할 수 있도록 하고 그에 대한 절대적인 '경로'를 확인합니다.JSON의 큰 덩어리를 반환하지만 문서가 엉망인 API를 쉽게 탐색할 수 있습니다.
9. json-e
JSON-e는 JSON 오브젝트에 콘텍스트를 삽입하기 위한 데이터 구조 파라미터화 시스템입니다.중심 아이디어는 데이터 구조를 "템플릿"으로 취급하고 다른 데이터 구조를 컨텍스트로 사용하여 변환하여 출력 데이터 구조를 생성하는 것입니다.
10. JSLT
JSLT는 JSON을 위한 완전한 쿼리 및 변환 언어입니다.언어 디자인은 jq, XPath 및 XQuery에서 영감을 받았습니다.
11. JSONata
JSONata는 JSON 데이터를 위한 경량 쿼리 및 변환 언어입니다.XPath 3.1의 '위치 경로' 의미론에서 영감을 받아 정교한 쿼리를 간결하고 직관적인 표기로 표현할 수 있습니다.
12. JSONPath Plus
JSON 문서(및 JavaScript 개체)에서 데이터를 분석, 변환 및 선택적으로 추출합니다.jsonpath-plus는 원래 사양을 확장하여 연산자를 추가하고 원본이 설명하지 않은 일부 동작을 명시합니다.
13. json-transforms Last Commit 2017년 12월 1일
JSON 데이터를 변환하기 위한 재귀적인 패턴 매칭 방식을 제공합니다.변환은 JSON 객체의 구조에 일치하는 규칙 집합으로 정의됩니다.일치가 발생하면 규칙은 변환된 데이터를 내보내고 선택적으로 반복하여 하위 개체를 변환합니다.
14. json 최종 커밋 2018년 6월 23일
json은 JSON을 사용하기 위한 빠른 CLI 도구입니다.외부 dep가 없는 단일 파일 node.js 스크립트입니다(node.js 자체 제외).
15. jsawk 최종 커밋 2015년 3월 4일
Jsawk은 awk같지만 JSON에게는.stdin에서 읽어낸 JSON 오브젝트의 배열을 사용하여 작업하고 JavaScript를 사용하여 필터링하여 stdout으로 출력되는 결과 배열을 생성합니다.
16. 마지막 커밋 2017년 3월 13일
테스트는 문서 https://github.com/pasaran/yate/tree/master/tests에서 사용할 수 있습니다.
17. jsonpath-object-transform 최종 커밋 2017년 1월 18일
JSONPath를 사용하여 개체 리터럴에서 데이터를 가져와 템플릿을 기반으로 새 개체를 생성합니다.
18. 스테이플링 최종 커밋 2013년 9월 16일
스테이플링은 JSON 오브젝트의 XSLT 포맷을 가능하게 하는 JavaScript 라이브러리입니다.JavaScript 템플릿 엔진 및 text/html 템플릿을 사용하는 대신, Stapling을 사용하면 JSON 데이터 소스를 해석하기 위해 Ajax와 비동기적으로 로드된 다음 캐시된 클라이언트 측 XSLT 템플릿을 사용할 수 있습니다.
사양:
JSON 포인터는 JavaScript Object Notation(JSON) 문서 내에서 특정 값을 식별하기 위한 문자열 구문을 정의합니다.
JSONPath 식은 항상 XPath 식을 XML 문서와 조합하여 사용하는 것과 동일한 방법으로 JSON 구조를 참조합니다.
JSPath for JSON은 XPath for XML과 같습니다."
JSONiq의 영감의 주요 원천은 XQuery입니다.XQuery는 지금까지 반구조화 데이터에 대한 성공적이고 생산적인 쿼리 언어임이 입증되었습니다.
JMESPath는 JSON용 쿼리 언어입니다.JMESPath 언어는 완전한 사양의 ABNF 문법으로 설명되어 있습니다.
흥미로운 생각이네요.Google에서 검색한 결과 다음과 같은 몇 페이지에 관심이 있었습니다.
이게 도움이 됐으면 좋겠다.
JOLT 해봐.Java로 작성된 JSON-to-JSON 변환 라이브러리입니다.
이것은 특별히 "JSON -> XML -> XSLT -> XML -> JSON" 게임을 하고 싶지 않기 때문에 작성되었습니다.또한 충분히 복잡한 변환에 템플릿을 사용하는 것은 유지할 수 없습니다.
XSLT는 http://www.w3.org/TR/xslt-30/ #json에서 볼 수 있듯이 JSON을 지원합니다.
XML은 구분자 토큰에 각 괄호를 사용하고, JSON은 대괄호, 대괄호 등을 사용합니다.즉, XML의 토큰 인식 비교가 적다는 것은 선언적 변환에 최적화되어 있다는 것을 의미합니다.또한 스위치 문과 같은 비교가 많아지면 스크립트 언어의 명령 코드가 유용한 추측 분기 예측을 상정하고 있습니다.따라서 다양한 반구조화 데이터의 혼합에 대해 응답 페이지의 일부로 XSLT와 Javascript 엔진의 성능을 벤치마킹할 수 있습니다.데이터 페이로드가 거의 없는 경우 XML 시리얼라이제이션 없이 JSON에서도 변환이 정상적으로 동작할 수 있습니다.W3의 결정은 더 나은 분석에 근거해야 한다.
같이 것이 하게 XSLT를 name ★★★★★★★★★★★★★★★★★」address하다:[.name, .address]
튜토리얼에서는 Twitter의 JSON API를 변환하는 예를 소개합니다(매뉴얼에는 많은 예가 있습니다).
최근 JSON 스타일링에 좋아하는 툴 https://github.com/twigkit/tempo을 찾았습니다.XSLT보다 사용하기 쉬운 툴로 XPATH 쿼리가 필요 없습니다.
jsonpath-object-transform을 확인합니다.
나는 최근에 이것에 대해 나만의 작은 도서관을 썼는데, 그것은 가까이 있으려고 노력한다.
5.1 프로세싱 모델(XSLT REC) https://www.w3.org/TR/xslt#section-Processing-Model
JavaScript 코드의 몇 줄에서 가능한 한(어쨌든) 가능한 한.
여기 몇 가지 간단한 사용 예가 있습니다.
1. JSON-to-some-markup:
바이올린: https://jsfiddle.net/YSharpLanguage/kj9pk8oz/10
(D.1 문서 예(XSLT REC)에서 영감을 얻어 https://www.w3.org/TR/xslt#section-Document-Example)
이 경우:
var D1document = {
type: "document", title: [ "Document Title" ],
"": [
{ type: "chapter", title: [ "Chapter Title" ],
"": [
{ type: "section", title: [ "Section Title" ],
"": [
{ type: "para", "": [ "This is a test." ] },
{ type: "note", "": [ "This is a note." ] }
] },
{ type: "section", title: [ "Another Section Title" ],
"": [
{ type: "para", "": [ "This is ", { emph: "another" }, " test." ] },
{ type: "note", "": [ "This is another note." ] }
] }
] }
] };
var D1toHTML = { $: [
[ [ function(node) { return node.type === "document"; } ],
function(root) {
return "<html>\r\n\
<head>\r\n\
<title>\r\n\
{title}\r\n".of(root) + "\
</title>\r\n\
</head>\r\n\
<body>\r\n\
{*}".of(root[""].through(this)) + "\
</body>\r\n\
</html>";
}
],
[ [ function(node) { return node.type === "chapter"; } ],
function(chapter) {
return " <h2>{title}</h2>\r\n".of(chapter) + "{*}".of(chapter[""].through(this));
}
],
[ [ function(node) { return node.type === "section"; } ],
function(section) {
return " <h3>{title}</h3>\r\n".of(section) + "{*}".of(section[""].through(this));
}
],
[ [ function(node) { return node.type === "para"; } ],
function(para) {
return " <p>{*}</p>\r\n".of(para[""].through(this));
}
],
[ [ function(node) { return node.type === "note"; } ],
function(note) {
return ' <p class="note"><b>NOTE: </b>{*}</p>\r\n'.of(note[""].through(this));
}
],
[ [ function(node) { return node.emph; } ],
function(emph) {
return "<em>{emph}</em>".of(emph);
}
]
] };
console.log(D1document.through(D1toHTML));
...은 다음을 제공합니다.
<html>
<head>
<title>
Document Title
</title>
</head>
<body>
<h2>Chapter Title</h2>
<h3>Section Title</h3>
<p>This is a test.</p>
<p class="note"><b>NOTE: </b>This is a note.</p>
<h3>Another Section Title</h3>
<p>This is <em>another</em> test.</p>
<p class="note"><b>NOTE: </b>This is another note.</p>
</body>
</html>
그리고.
2. JSON-to-JSON:
바이올린: https://jsfiddle.net/YSharpLanguage/ppfmmu15/10
이 경우:
// (A "Company" is just an object with a "Team")
function Company(obj) {
return obj.team && Team(obj.team);
}
// (A "Team" is just a non-empty array that contains at least one "Member")
function Team(obj) {
return ({ }.toString.call(obj) === "[object Array]") &&
obj.length &&
obj.find(function(item) { return Member(item); });
}
// (A "Member" must have first and last names, and a gender)
function Member(obj) {
return obj.first && obj.last && obj.sex;
}
function Dude(obj) {
return Member(obj) && (obj.sex === "Male");
}
function Girl(obj) {
return Member(obj) && (obj.sex === "Female");
}
var data = { team: [
{ first: "John", last: "Smith", sex: "Male" },
{ first: "Vaio", last: "Sony" },
{ first: "Anna", last: "Smith", sex: "Female" },
{ first: "Peter", last: "Olsen", sex: "Male" }
] };
var TO_SOMETHING_ELSE = { $: [
[ [ Company ],
function(company) {
return { some_virtual_dom: {
the_dudes: { ul: company.team.select(Dude).through(this) },
the_grrls: { ul: company.team.select(Girl).through(this) }
} }
} ],
[ [ Member ],
function(member) {
return { li: "{first} {last} ({sex})".of(member) };
} ]
] };
console.log(JSON.stringify(data.through(TO_SOMETHING_ELSE), null, 4));
...은 다음을 제공합니다.
{
"some_virtual_dom": {
"the_dudes": {
"ul": [
{
"li": "John Smith (Male)"
},
{
"li": "Peter Olsen (Male)"
}
]
},
"the_grrls": {
"ul": [
{
"li": "Anna Smith (Female)"
}
]
}
}
}
3. XSLT vs. JavaScript:
JavaScript는 다음과 같습니다.
XSLT 3.0 REC 섹션 14.4 예: 공통값에 근거한 노드의 그룹화
( http://jsfiddle.net/YSharpLanguage/8bqcd0ey/1) )
Cf. https://www.w3.org/TR/xslt-30/ #filename-filename
여기서...
var cities = [
{ name: "Milano", country: "Italia", pop: 5 },
{ name: "Paris", country: "France", pop: 7 },
{ name: "München", country: "Deutschland", pop: 4 },
{ name: "Lyon", country: "France", pop: 2 },
{ name: "Venezia", country: "Italia", pop: 1 }
];
/*
Cf.
XSLT 3.0 REC Section 14.4
Example: Grouping Nodes based on Common Values
https://www.w3.org/TR/xslt-30/#grouping-examples
*/
var output = "<table>\r\n\
<tr>\r\n\
<th>Position</th>\r\n\
<th>Country</th>\r\n\
<th>City List</th>\r\n\
<th>Population</th>\r\n\
</tr>{*}\r\n\
</table>".of
(
cities.select().groupBy("country")(function(byCountry, index) {
var country = byCountry[0],
cities = byCountry[1].select().orderBy("name");
return "\r\n\
<tr>\r\n\
<td>{position}</td>\r\n\
<td>{country}</td>\r\n\
<td>{cities}</td>\r\n\
<td>{population}</td>\r\n\
</tr>".
of({ position: index + 1, country: country,
cities: cities.map(function(city) { return city.name; }).join(", "),
population: cities.reduce(function(sum, city) { return sum += city.pop; }, 0)
});
})
);
...은 다음을 제공합니다.
<table>
<tr>
<th>Position</th>
<th>Country</th>
<th>City List</th>
<th>Population</th>
</tr>
<tr>
<td>1</td>
<td>Italia</td>
<td>Milano, Venezia</td>
<td>6</td>
</tr>
<tr>
<td>2</td>
<td>France</td>
<td>Lyon, Paris</td>
<td>9</td>
</tr>
<tr>
<td>3</td>
<td>Deutschland</td>
<td>München</td>
<td>4</td>
</tr>
</table>
4. JSONIQ vs.JavaScript:
JavaScript는 다음과 같습니다.
JSONiq 사용 사례 섹션 1.1.2. JSON에 대한 그룹화 쿼리
( https://jsfiddle.net/YSharpLanguage/hvo24hmk/3) )
CF. http://jsoniq.org/docs/JSONiq-usecases/html-single/index.html#jsongrouping
여기서...
/*
1.1.2. Grouping Queries for JSON
http://jsoniq.org/docs/JSONiq-usecases/html-single/index.html#jsongrouping
*/
var sales = [
{ "product" : "broiler", "store number" : 1, "quantity" : 20 },
{ "product" : "toaster", "store number" : 2, "quantity" : 100 },
{ "product" : "toaster", "store number" : 2, "quantity" : 50 },
{ "product" : "toaster", "store number" : 3, "quantity" : 50 },
{ "product" : "blender", "store number" : 3, "quantity" : 100 },
{ "product" : "blender", "store number" : 3, "quantity" : 150 },
{ "product" : "socks", "store number" : 1, "quantity" : 500 },
{ "product" : "socks", "store number" : 2, "quantity" : 10 },
{ "product" : "shirt", "store number" : 3, "quantity" : 10 }
];
var products = [
{ "name" : "broiler", "category" : "kitchen", "price" : 100, "cost" : 70 },
{ "name" : "toaster", "category" : "kitchen", "price" : 30, "cost" : 10 },
{ "name" : "blender", "category" : "kitchen", "price" : 50, "cost" : 25 },
{ "name" : "socks", "category" : "clothes", "price" : 5, "cost" : 2 },
{ "name" : "shirt", "category" : "clothes", "price" : 10, "cost" : 3 }
];
var stores = [
{ "store number" : 1, "state" : "CA" },
{ "store number" : 2, "state" : "CA" },
{ "store number" : 3, "state" : "MA" },
{ "store number" : 4, "state" : "MA" }
];
var nestedGroupingAndAggregate = stores.select().orderBy("state").groupBy("state")
( function(byState) {
var state = byState[0],
stateStores = byState[1];
byState = { };
return (
(
byState[state] =
products.select().orderBy("category").groupBy("category")
( function(byCategory) {
var category = byCategory[0],
categoryProducts = byCategory[1],
categorySales = sales.filter(function(sale) {
return stateStores.find(function(store) { return sale["store number"] === store["store number"]; }) &&
categoryProducts.find(function(product) { return sale.product === product.name; });
});
byCategory = { };
return (
(
byCategory[category] =
categorySales.select().orderBy("product").groupBy("product")
( function(byProduct) {
var soldProduct = byProduct[0],
soldQuantities = byProduct[1];
byProduct = { };
return (
(
byProduct[soldProduct] =
soldQuantities.reduce(function(sum, sale) { return sum += sale.quantity; }, 0)
),
byProduct
);
} ) // byProduct()
),
byCategory
);
} ) // byCategory()
),
byState
);
} ); // byState()
...은 다음을 제공합니다.
[
{
"CA": [
{
"clothes": [
{
"socks": 510
}
]
},
{
"kitchen": [
{
"broiler": 20
},
{
"toaster": 150
}
]
}
]
},
{
"MA": [
{
"clothes": [
{
"shirt": 10
}
]
},
{
"kitchen": [
{
"blender": 250
},
{
"toaster": 50
}
]
}
]
}
]
이 SO 질문(및 기타 사항)에서 제기되는 상위 축에 대한 JSONPath wrt. 쿼리의 한계를 극복하는 데도 유용합니다.
예: 브랜드 ID를 알고 있는 식료품 품목의 할인을 받는 방법
{
"prods": [
{
"info": {
"rate": 85
},
"grocery": [
{
"brand": "C",
"brand_id": "984"
},
{
"brand": "D",
"brand_id": "254"
}
],
"discount": "15"
},
{
"info": {
"rate": 100
},
"grocery": [
{
"brand": "A",
"brand_id": "983"
},
{
"brand": "B",
"brand_id": "253"
}
],
"discount": "20"
}
]
}
?
생각할 수 있는 해결책은 다음과 같습니다.
var products = {
"prods": [
{
"info": {
"rate": 85
},
"grocery": [
{
"brand": "C",
"brand_id": "984"
},
{
"brand": "D",
"brand_id": "254"
}
],
"discount": "15"
},
{
"info": {
"rate": 100
},
"grocery": [
{
"brand": "A",
"brand_id": "983"
},
{
"brand": "B",
"brand_id": "253"
}
],
"discount": "20"
}
]
};
function GroceryItem(obj) {
return (typeof obj.brand === "string") && (typeof obj.brand_id === "string");
}
// last parameter set to "true", to grab all the "GroceryItem" instances
// at any depth:
var itemsAndDiscounts = [ products ].nodeset(GroceryItem, true).
map(
function(node) {
var item = node.value, // node.value: the current "GroceryItem" (aka "$.prods[*].grocery[*]")
discount = node.parent. // node.parent: the array of "GroceryItem" (aka "$.prods[*].grocery")
parent. // node.parent.parent: the product (aka "$.prods[*]")
discount; // node.parent.parent.discount: the product discount
// finally, project into an easy-to-filter form:
return { id: item.brand_id, discount: discount };
}
),
discountOfItem983;
discountOfItem983 = itemsAndDiscounts.
filter
(
function(mapped) {
return mapped.id === "983";
}
)
[0].discount;
console.log("Discount of #983: " + discountOfItem983);
...그것은 다음과 같습니다.
Discount of #983: 20
'HTH'
도구의 부족을 시사하는 것은 단지 질문을 구걸하는 것이다.Linux에서의 X 또는 Y 지원에도 같은 것이 적용될 수 있습니다(소수 OS용 고품질 드라이버 및/또는 게임을 굳이 개발해야 하는 이유).또, 대기업의 게임이나 하드웨어 기업이 개발하지 않는 OS에 주목하는 이유는 무엇입니까?)XSLT 및 JSON을 사용해야 하는 사용자는 다음과 같은 간단한 회피책을 사용하게 될 수 있습니다.JSON을 XML로 변환하는 것. 하지만 그게 최적의 솔루션은 아니죠?
네이티브 JSON 포맷이 있고 브라우저에서 "wysywyg"를 편집하려면 XSLT를 사용하는 것이 이 문제에 대한 적절한 해결책으로 충분합니다.전통적인 자바스크립트 프로그래밍으로 그렇게 하는 것은 골칫거리가 될 수 있다.
실제로 XSLT에 대해 "석기적" 접근방식을 구현했습니다.서브스트링 파싱을 사용하여 템플릿을 호출하거나 아이를 처리하는 등의 Javascript용 기본 명령어를 해석합니다.확실히 변환 엔진을 JSON 오브젝트로 실장하는 것은 XSLT를 해석하기 위한 완전한 XML 파서를 실장하는 것보다 훨씬 쉽습니다.문제는 XML 템플릿을 사용하여 JSON 개체를 변환하려면 템플릿의 XML을 해석해야 한다는 것입니다.
XML(또는 HTML, 텍스트 등)을 사용하여 JSON 개체를 변환하려면 구문과 변환 명령을 식별하기 위해 사용해야 하는 특수 문자를 신중하게 고려해야 합니다.그렇지 않으면 커스텀 템플릿 언어에 맞는 파서를 설계해야 합니다.그 길을 걸어보면 예쁘지 않다는 걸 알 수 있어요.
갱신(2010년 11월 12일):파서를 몇 주 동안 작업한 후 최적화할 수 있었습니다.템플릿은 미리 구문 분석되고 명령어는 JSON 개체로 저장됩니다.변환 규칙도 JSON 객체이지만 템플릿코드는 셸 코드와 유사한 HTML과 홈브루 구문을 혼합한 것입니다.복잡한 JSON 문서를 HTML로 변환하여 문서 편집기를 만들 수 있었습니다.코드는 에디터용 약 1K라인(개인 프로젝트용이므로 공유할 수 없습니다)과 JSON 변환 코드용 약 990라인(반복 명령, 단순 비교, 템플릿 호출, 변수 저장 및 평가 포함)입니다.MIT 라이선스로 출시할 예정입니다.관여하고 싶으면 나에게 메일을 보내라.
오래된 질문에 대한 또 다른 새로운 해답으로, 디피안트를 살펴보도록 하겠습니다.JS. 이것은 JSON의 XSLT가 아니라 JSON의 XSLT입니다.문서의 "템플릿" 섹션에는 다음 예가 포함되어 있습니다.
<!-- Defiant template -->
<script type="defiant/xsl-template">
<xsl:template name="books_template">
<xsl:for-each select="//movie">
<xsl:value-of select="title"/><br/>
</xsl:for-each>
</xsl:template>
</script>
<script type="text/javascript">
var data = {
"movie": [
{"title": "The Usual Suspects"},
{"title": "Pulp Fiction"},
{"title": "Independence Day"}
]
},
htm = Defiant.render('books_template', data);
console.log(htm);
// The Usual Suspects<br>
// Pulp Fiction<br>
// Independence Day<br>
있다!저는 최근에 바로 이 목적을 위해 json-transforms라는 라이브러리를 만들었습니다.
https://github.com/ColinEberhardt/json-transforms
XSLT에서 직접 영감을 받아 XPath에 모델링된 DSL인 JSPath와 재귀 패턴 매칭 접근 방식을 조합하여 사용합니다.
여기 간단한 예가 있습니다.다음 JSON 오브젝트가 지정됩니다.
const json = {
"automobiles": [
{ "maker": "Nissan", "model": "Teana", "year": 2011 },
{ "maker": "Honda", "model": "Jazz", "year": 2010 },
{ "maker": "Honda", "model": "Civic", "year": 2007 },
{ "maker": "Toyota", "model": "Yaris", "year": 2008 },
{ "maker": "Honda", "model": "Accord", "year": 2011 }
]
};
다음과 같은 변화가 있습니다.
const jsont = require('json-transforms');
const rules = [
jsont.pathRule(
'.automobiles{.maker === "Honda"}', d => ({
Honda: d.runner()
})
),
jsont.pathRule(
'.{.maker}', d => ({
model: d.match.model,
year: d.match.year
})
),
jsont.identity
];
const transformed = jsont.transform(json, rules);
출력은 다음과 같습니다.
{
"Honda": [
{ "model": "Jazz", "year": 2010 },
{ "model": "Civic", "year": 2007 },
{ "model": "Accord", "year": 2011 }
]
}
3번입니다.첫 번째는 혼다제 자동차와 일치하며, 물체와 매칭합니다.Honda이치노은 어떤 합니다.maker,, " " "model ★★★★★★★★★★★★★★★★★」year으로 일치하는 입니다.아이디입니다.
저는 엄청난 양의 JavaScript 템플릿 엔진과 그 모든 인라인 HTML 템플릿, 다양한 마크업 스타일 등에 지쳐서 JSON 데이터 구조를 위한 XSLT 포맷을 가능하게 하는 작은 라이브러리를 구축하기로 했습니다.로켓 과학이 아니라 JSON을 XML로 해석하고 XSLT 문서로 포맷하는 것입니다.크롬의 JavaScript 템플릿 엔진만큼 빠르지는 않지만, 대부분의 다른 브라우저에서는 더 큰 데이터 구조를 위한 JS 엔진만큼 빠릅니다.
Camel route umarshal(xmljson) -> to(xlst) -> marshal(xmljson)을 사용하고 있습니다.충분한 효율(100% 완벽하지는 않지만)을 발휘하지만 이미 Camel을 사용하고 있다면 심플합니다.
JSONiq는 이러한 표준이며 Zorba는 오픈 소스 C++ 구현입니다.JSONiq는 네이티브 데이터 유형으로 JSON을 추가하는 XQuery로도 볼 수 있습니다.
JSLT는 XSLT와 동등한 JSON에 매우 가깝습니다.출력의 고정 부분을 JSON 구문으로 쓴 다음 식을 삽입하여 템플릿에 삽입할 값을 계산하는 변환 언어입니다.
예:
{
"time": round(parse-time(.published, "yyyy-MM-dd'T'HH:mm:ssX") * 1000),
"device_manufacturer": .device.manufacturer,
"device_model": .device.model,
"language": .device.acceptLanguage
}
잭슨에 이어 자바에도 구현되어 있습니다.
XSLT를 사용하여 JSON을 변환할 수 있습니다.JSON2 SAX 디시리얼라이저와 SAX2JSON 시리얼라이저가 필요합니다.
자바 코드 예시:http://www.gerixsoft.com/blog/json/xslt4json
Yate(https://github.com/pasaran/yate)는 XSLT 이후에 특별히 설계되었으며 JPath(JS에 해당하는 자연 XPath)를 특징으로 하며 JavaScript에 컴파일되어 상당한 프로덕션 사용 역사를 가지고 있습니다.거의 문서화되어 있지 않지만 샘플과 검사를 통해 읽으면 충분합니다.
Mr. Data Coverter를 사용하여 JSON을 XML로 변환하고 XSLT를 사용하여 변환한 후 다시 JSON으로 변경하는 것은 어떻습니까?
순수 JavaScript와 XSLT의 매칭 표현식 및 재귀 템플릿의 배후에 있는 친숙하고 선언적인 패턴을 활용하는 접근방식의 작업 낙서/개념 증명에 대해서는, https://gist.github.com/brettz9/0e661b3093764f496e36 를 참조해 주세요.
(JSON에서도 같은 어프로치를 사용할 수 있습니다).
데모에서는 파이어폭스에서의 템플릿 표현에 편리하도록 JavaScript 1.8 표현 클로저에 의존합니다(최소한 메서드의 ES6 단축 형식이 구현될 때까지는).
면책사항:이건 나만의 암호야
Jackson 기반의 처리 프레임워크용 dom 어댑터를 오래전에 작성했습니다.nu.xom 라이브러리를 사용합니다.결과적으로 생성되는 dom 트리는 java xpath 및 xslt 기능에서 작동합니다.저는 매우 간단한 몇 가지 구현 선택을 했습니다.예를 들어 루트 노드는 항상 "root"로 불리며 어레이는 li 하위 요소(html에서와 같이)를 가진 ol 노드로 들어가고, 다른 모든 것은 원시 값을 가진 하위 노드 또는 다른 개체 노드일 뿐입니다.
사용방법: JsonObject sampleJson = sampleJson(); org.w3c.dom.Document domNode = JsonXmlConverter.getW3cDocument(sampleJson, "root");
아직 제시되지 않은 접근법 중 하나는 파서 제너레이터를 사용하여 XSLT에서 파서를 생성하여 JSON을 해석하고 XML 출력을 생성하는 것입니다.
XML 컨퍼런스에서 많이 언급되는 옵션 중 하나는 ReX 파서 제너레이터(http://www.bottlecaps.de/rex/)입니다. 사이트에서 완전히 문서화되어 있지 않지만 검색 시 레시피를 사용할 수 있습니다.
XSLT를 JSON과 함께 사용할 수 있습니다.XPath(3.1) XSLT(3.0) 및 XQuery(3.1)의 Verson 3은 JSON을 지원합니다.이는 Saxon 상용 버전에서 사용할 수 있는 것으로 보이며, 언젠가는 HE 버전에 포함될 수 있습니다.https://www.saxonica.com/html/documentation/functions/fn/parse-json.html
-
대체 솔루션에서 기대하는 점:
JSON을 입력하여 일치하는 데이터 세트를 가져오고 JSON 또는 TEXT를 출력할 수 있으면 좋겠습니다.
임의 속성에 액세스하여 값을 평가합니다.
조건부 로직 지원
변환 스크립트는 툴의 외부, 텍스트 기반, 그리고 가급적 일반적으로 사용되는 언어로 하고 싶습니다.
잠재적인 대안?
SQL이 적절한 대안이 될 수 있을지 궁금합니다.https://learn.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server
대체 툴로 JSON과 XML https://learn.microsoft.com/en-us/sql/relational-databases/xml/openxml-sql-server을 처리할 수 있으면 좋겠습니다.
사용하고 있는 XSLT 스크립트를 SQL로 변환하거나 이 옵션을 완전히 평가한 적은 없지만 조만간 자세히 알아보도록 하겠습니다.아직까지는 몇 가지 생각뿐이에요.
Csv 크런처
이름으로는 알 수 없지만 CsvCruncher는 표 형식의* JSON 데이터를 읽고 SQL을 사용하여 효율적으로 처리할 수 있습니다.
*표 형식이란 JSON 트리의 일부가 규칙적이라는 것을 의미합니다. 즉, 동일하거나 유사한 구조의 항목이 하나에서 다수에 이르는 것입니다.
CsvCruncher가 트리의 이 부분을 SQL 테이블로 변환하면 완전한 SQL 구문을 사용하여 조회할 수 있습니다.
여러 JSON 트리를 로드하여 여러 테이블을 재생할 수도 있습니다.
SQL JSON(CSV)입니다.
이것은, 정말로 복잡한 XSLT의 어프로치보다 훨씬 도움이 되었습니다(심각하게 알고 있으면 매우 즐겁습니다).
면책사항:저는 CsvCruncher 개발자입니다.
이것이 필요한지 잘 모르겠고, 도구의 부족은 필요성의 결여를 시사합니다.JSON은 객체로서 가장 잘 처리되며(JS에서 실행되는 방식), 일반적으로 객체 자체의 언어를 사용하여 변환을 수행합니다(JSON에서 생성된 Java 객체의 경우 Java, Perl, Python, Perl, c#, PHP 등의 경우).통상적인 할당(또는 설정, 취득), 루프 등입니다.
즉, XSLT는 다른 언어일 뿐이며 XML이 필요한 이유 중 하나는 XML이 객체 표기가 아니기 때문에 프로그래밍 언어의 객체가 정확하게 들어맞지 않는다는 것입니다(계층형 xml 모델과 객체/구조 간의 영향).
언급URL : https://stackoverflow.com/questions/1618038/xslt-equivalent-for-json
'programing' 카테고리의 다른 글
| woocommerce 관리 주문 페이지 편집 방법 (0) | 2023.03.23 |
|---|---|
| 상태에서의 어레이에 값을 추가하는 가장 좋은 방법은 무엇입니까? (0) | 2023.03.23 |
| jq 필터에 인수 전달 (0) | 2023.03.23 |
| new NativeEventEmitter()는 필수 addListener 메서드 없이 null 이외의 인수를 사용하여 호출되었습니다. (0) | 2023.03.23 |
| Woocommerce - 고객이 특정 역할인 경우 다른 PayPal 이메일 주소를 설정합니다. (0) | 2023.03.23 |