문제

거기에 XSLT JSON과 동일합니까?XSLT가 XML로 변환하는 것처럼 JSON에서 변환을 수행할 수 있게 해주는 것입니다.

도움이 되었습니까?

해결책

흥미로운 아이디어. Google에서의 일부 검색은 다음을 포함하여 몇 페이지에 관심이 있습니다.

도움이 되었기를 바랍니다.

다른 팁

노력하다 심한 상하의 움직임. Java로 작성된 JSON TO JSON TRANSFORMATION 라이브러리입니다.

"JSON-> XML-> XSLT-> XML-> JSON"게임을 재생하고 싶지 않았기 때문에 구체적으로 만들어졌으며 충분히 복잡한 변환을 위해 템플릿을 사용하는 것은 유지할 수 없기 때문입니다.

JSON의 XSLT 등가 - 후보자 목록 (도구 및 사양)

도구

  1. xslt

    당신이 사용할 수있는 JSON 용 XSLT ~을 목표로 FN : JSON-to-XML.

    이 섹션에서는 XSLT를 사용하여 JSON 데이터를 처리 할 수있는 시설에 대해 설명합니다.

  2. JQ

    JQ는 JSON 데이터의 SED와 같습니다. SED, AWK, GREP 및 친구가 텍스트를 가지고 놀 수있는 것과 동일한 쉽게 구조화 된 데이터를 슬라이스하고 필터링하고 맵핑하고 맵핑 할 수 있습니다. 다른 OS 용 설치 패키지가 있습니다.

  3. JJ

    JJ는 JSON 문서에서 값을 검색하거나 업데이트하는 빠르고 간단한 방법을 제공하는 명령 줄 유틸리티입니다. 그것은 GJSON과 SJSON이 후드 아래로 구동됩니다.

  4. FX

    명령 줄 JSON 처리 도구

    • 새로운 구문을 배울 필요가 없습니다
    • 평범한 자바 스크립트
    • 서식 및 강조 표시
    • 독립형 바이너리
  5. JL

    JL ( "JSON LAMBDA")은 JSON을 쿼리하고 조작하는 작은 기능적 언어입니다.

  6. 심한 상하의 움직임

    JSON에서 JSON 변환 라이브러리는 Java로 작성된 변환에 대한 "사양"자체가 JSON 문서입니다.

  7. 그론

    JSON을 greppable로 만드십시오! Gron은 JSON을 이산 할당으로 변환하여 원하는 것을 쉽게 만들고 절대적인 '경로'를 볼 수 있도록합니다. JSON의 큰 덩어리를 반환하지만 끔찍한 문서를 가지고있는 API의 탐색을 완화시킵니다.

  8. JSON

    JSON은 JSON과 작업하기위한 빠른 CLI 도구입니다. 외부 DEP (Node.js 자체를 제외한)가없는 단일 파일 노드.

  9. JSON-E

    JSON-E는 JSON 객체에 컨텍스트를 임베딩하기위한 데이터 구조 매개 변수화 시스템입니다. 중심 아이디어는 데이터 구조를 "템플릿"으로 취급하고 다른 데이터 구조를 컨텍스트로 사용하여 출력 데이터 구조를 생성하는 것입니다.

  10. JSLT

    JSLT는 JSON의 완전한 쿼리 및 변환 언어입니다. 언어 디자인은 JQ, XPath 및 XQuery에서 영감을 얻었습니다.

  11. JSON 변환 마지막 커밋 2017 년 12 월 1 일

    JSON 데이터 변환에 대한 재귀 적 패턴 매칭 접근법을 제공합니다. 변환은 JSON 객체의 구조와 일치하는 일련의 규칙으로 정의됩니다. 일치가 발생하면 규칙은 변환 된 데이터를 제출하여 선택적으로 자식 객체를 변환하기 위해 선택적으로 되풀이됩니다.

  12. jsawk 마지막 커밋 2015 년 3 월 4 일

    jsawk는 awk와 같지만 JSON의 경우입니다. Stdin에서 읽은 JSON 객체 배열로 작업하여 JavaScript를 사용하여 필터링하여 stdout에 인쇄 된 결과 배열을 생성합니다.

  13. 예가 마지막 커밋 2017 년 3 월 13 일

    테스트는 DOCU로 사용할 수 있습니다 https://github.com/pasaran/yate/tree/master/tests

  14. JSONPATH-OBJECT-TRANSFORM 마지막 커밋 2017 년 1 월 18 일

    JSONPATH를 사용하여 객체 리터럴에서 데이터를 가져오고 템플릿을 기반으로 새 개체를 생성합니다.

  15. 스테이플 링 마지막 커밋 2013 년 9 월 16 일

    스테이플 링은 JSON 개체에 대한 XSLT 형식을 활성화하는 JavaScript 라이브러리입니다. JavaScript 템플릿 엔진 및 텍스트/HTML 템플릿을 사용하는 대신 Stapling을 사용하면 XSLT 템플릿을 사용하여 AJAX와 비동기로로드 한 다음 CACHED 클라이언트 측면을 사용하여 JSON DataSources를 구문 분석 할 수 있습니다.

명세서:

  • JSONPOINTER

    JSON POINTER JAVASCRIPT 객체 표기법 (JSON) 문서 내에서 특정 값을 식별하기위한 문자열 구문을 정의합니다.

  • JSONPATH

    JSONPATH 표현식은 항상 XPATH 표현식과 동일한 방식으로 JSON 구조를 XML 문서와 함께 사용합니다.

  • jspath

    JSON의 JSPATH는 XML의 XPath와 같습니다. "

  • JSONIQ

    JSONIQ의 주요 영감의 원천은 XQuery이며, 지금까지 반 구조화 된 데이터에 대한 성공적이고 생산적인 쿼리 언어로 입증되었습니다.

XSLT는 본대로 JSON을 지원합니다 http://www.w3.org/tr/xslt-30/#json

XML은 구분자 토큰에 각도 브래킷을 사용하고 JSON은 버팀대, 사각형 브래킷, ... I. e. XML의 더 적은 토큰 인식 비교는 선언적 변환에 최적화되었음을 의미하는 반면, 스위치 문처럼 더 많은 비교는 스크립팅 언어의 명령 코드가 유용하다는 추측 지점 예측을 가정합니다. 직접적인 결과적으로 반 구조화 된 데이터의 다른 혼합의 경우 반응 형 페이지의 일부로 XSLT 및 JavaScript 엔진의 성능을 벤치마킹 할 수 있습니다. 무시할만한 데이터 페이로드의 경우 XML 직렬화가없는 JSON과 마찬가지로 변환이 작동 할 수 있습니다. W3의 결정은 더 나은 분석을 기반으로해야합니다.

최근에 JSON 스타일링을 좋아하는 도구를 찾았습니다. https://github.com/twigkit/tempo. 내 의견으로는 XSLT보다 작업하기가 훨씬 쉽습니다. XPath 쿼리가 필요하지 않습니다.

JQ- 가볍고 유연한 명령 줄 JSON 프로세서

XSLT와 같은 템플릿 기반이 아니라 더 간결합니다. 예를 들어 추출합니다 name 그리고 address 배열로의 필드 : [.name, .address]

그만큼 지도 시간 트위터의 JSON API를 전환하는 예 (및 수동 많은 예제).

살펴보십시오 JSONPATH-OBJECT-TRANSFORM

도구가 부족하다고 말하면 필요 부족이 단지 질문을 구걸하는 것입니다. Linux에서 X 또는 Y를 지원하기 위해 동일하게 적용될 수 있습니다 (소수의 OS를위한 품질 운전자 및/또는 게임을 개발하는 이유는 무엇입니까? 그리고 큰 게임 및 하드웨어 회사가 개발하지 않는 OS에주의를 기울이는 이유는 무엇입니까?) 아마도 XSLT와 JSON을 사용해야하는 사람들은 다소 사소한 해결 방법을 사용하여 JSON을 XML로 변환합니다. 그러나 그것은 최적의 솔루션이 아닙니다.

기본 JSON 형식이 있고 브라우저에서 "wysywyg"를 편집하려는 경우 XSLT는 문제에 대한 적절한 솔루션 이상입니다. 전통적인 JavaScript 프로그래밍으로 그렇게하면 엉덩이에 고통이 될 수 있습니다.

실제로, 나는 템플릿을 호출, 프로세스 어린이 등과 같은 JavaScript의 일부 기본 명령을 해석하기 위해 서브 스트링 구문 분석을 사용하여 XSLT에 대한 "스톤 시대"접근 방식을 구현했습니다. XSLT를 구문 분석하기 위해 본격적인 XML 파서를 구현합니다. 문제는 XML 템플릿을 사용하여 JSON 객체를 변환하는 데 템플릿의 XML을 구문 분석해야한다는 것입니다.

XML (또는 html 또는 텍스트 또는 무엇이든)로 JSON 객체를 변형하려면 구문과 변환 명령을 식별하기 위해 어떤 특수 문자를 사용해야하는지 신중하게 생각해야합니다. 그렇지 않으면 결국 자신의 커스텀 템플릿 언어를 위해 구문 분석기를 설계해야합니다. 그 길을 걸었을 때, 나는 그것이 예쁘지 않다고 말할 수 있습니다.

업데이트 (2010 년 11 월 12 일) : 몇 주 동안 파서에서 작업 한 후 최적화 할 수있었습니다. 템플릿은 미리 구문 분석되며 명령은 JSON 객체로 저장됩니다. 변환 규칙은 JSON 객체이며 템플릿 코드는 HTML과 쉘 코드와 유사한 홈브류 구문의 혼합입니다. 복잡한 JSON 문서를 HTML로 변환하여 문서 편집기를 만들 수있었습니다. 이 코드는 편집기의 약 1K 라인 (개인 프로젝트에 대한 것이므로 공유 할 수 없습니다)과 JSON 변환 코드의 경우 약 990 줄 (반복 명령, 간단한 비교, 템플릿 호출, 가변 저장 및 평가 포함)입니다. MIT 라이센스에 따라 릴리스 할 계획입니다. 참여하고 싶다면 저에게 메일을 내려주세요.

나는이 주위에 내 자신의 작은 도서관을 썼는데, 최근에 가까이에 머물려고합니다.

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/ppfmu15/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/#grouping-examples

어디...

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 대 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
          }
        ]
      }
    ]
  }
]

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,

지금 있습니다! 나는 최근에 도서관을 만들었습니다. JSON 변환,이 목적을 위해 정확히 :

https://github.com/colineberhardt/json-transforms

그것은 조합을 사용합니다 jspath, XPath에 모델링 된 DSL 및 XSLT에서 직접 영감을 얻은 재귀 패턴 매칭 접근법.

다음은 빠른 예입니다. 다음 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 }
  ]
}

이 변환은 세 가지 규칙으로 구성됩니다. 첫 번째는 Honda가 만든 모든 자동차와 일치하며 Honda 재산, 재귀 적으로 일치합니다. 두 번째 규칙은 모든 객체와 일치합니다 maker 속성, 출력 model 그리고 year 속성. 마지막은 재귀 적으로 일치하는 정체성 변환입니다.

오래된 질문에 대한 또 다른 새로운 대답으로서, 나는 Defiantjs. XSLT가 아닙니다 동등한 JSON에게 ~이다 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>

나는 엄청난 양의 JavaScript 템플릿 엔진과 모든 인라인 HTML-Template, 다른 마크 업 스타일 등에 정말 지쳤고 결정했습니다. 작은 도서관을 만듭니다 이를 통해 JSON 데이터 구조에 대한 XSLT 형식이 가능합니다. 어떤 식 으로든 로켓 과학이 아닙니다. JSON은 XML로 구문 분석 한 다음 XSLT 문서와 형식화되었습니다. 크롬의 JavaScript 템플릿 엔진만큼 빠르지는 않지만 대부분의 다른 브라우저에서는 더 큰 데이터 구조의 JS 엔진 대안만큼 빠릅니다.

JSONIQ 그런 표준이며 조바 오픈 소스 C ++ 구현. JSONIQ는 JSON을 기본 데이터 유형으로 추가하여 XQuery로 볼 수 있습니다.

나는 Camel Route Umarshal (xmljson) -> to (xlst) -> Marshal (xmljson)을 사용하고 있습니다. 이미 낙타를 사용하고 있다면 충분히 효율적이지만 간단하지만 간단합니다.

XSLT를 사용하여 JSON을 변환 할 수 있습니다. JSON2SAX Deserializer 및 SAX2JSON SERIALIZER가 필요합니다.

Java의 샘플 코드 :http://www.gerixsoft.com/blog/json/xslt4json

예가https://github.com/pasaran/yate)는 XSLT 다음에 특별히 설계되었으며 JPATH (JS와 동등한 자연스러운 XPATH), JavaScript에 컴파일하며 생산 사용 이력이 상당히 높습니다. 실제로 문서화되지 않지만 샘플과 테스트를 읽는 것으로 충분해야합니다.

JSLT XSLT와 동등한 JSON에 매우 가깝습니다. JSON 구문에서 출력의 고정 된 부분을 작성한 다음 표현식을 삽입하여 템플릿에 삽입하려는 값을 계산하는 변환 언어입니다.

An example:

{
  "time": round(parse-time(.published, "yyyy-MM-dd'T'HH:mm:ssX") * 1000),
  "device_manufacturer": .device.manufacturer,
  "device_model": .device.model,
  "language": .device.acceptLanguage
}

Jackson 위에 Java에서 구현되었습니다.

이것에 대한 필요성이 너무 확실하지 않으며, 도구가 부족하면 필요가 부족하다는 것을 암시합니다. JSON은 객체 (어쨌든 JS에서 수행하는 방식)로 가장 잘 처리되며, 일반적으로 객체 자체의 언어를 사용하여 변환을 수행합니다 (JSON에서 생성 된 Java 개체, Perl, Python, Perl, C#, PHP 등 에). 정상 할당 (또는 설정, GET), 루핑 등으로.

내 말은, XSLT는 단지 다른 언어 일 뿐이며, 필요한 이유는 XML이 객체 표기법이 아니기 때문에 프로그래밍 언어의 객체가 정확히 적합하지 않기 때문입니다 (계층 적 XML 모델과 객체/structs 사이의 임피던스).

JSON을 XML로 전환하지 않겠습니까? Mr. Data Coverter , XSLT를 사용하여 트랜트 한 다음 동일하게 사용하여 JSON으로 다시 변경하십시오.

XSLT의 일치 표현 및 재귀 템플릿 뒤에 익숙하고 선언적인 패턴과 함께 순수한 JavaScript를 활용하는 접근 방식의 작동하는 낙서/개념 증명서를 보려면 참조하십시오. https://gist.github.com/brettz9/0e661b3093764f496e36

(JSON에게도 비슷한 접근법이 취해질 수 있습니다.)

데모는 또한 Firefox에서 템플릿을 표현할 때 편의를 위해 JavaScript 1.8 표현식 폐쇄에 의존합니다 (적어도 메소드에 대한 ES6 짧은 형식이 구현 될 때까지).

면책 조항 : 이것은 내 자신의 코드입니다.

나는 오래 전에 Jackson 기반 JSON 처리 프레임 워크에 대한 DOM 어댑터를 썼습니다. nu.xom 라이브러리를 사용합니다. 결과적인 DOM 트리는 Java XPath 및 XSLT 시설과 함께 작동합니다. 나는 매우 간단한 구현 선택을했습니다. 예를 들어 루트 노드는 항상 "루트"라고 불리며 배열은 Li Sub Elements (HTML과 같이)가있는 OL 노드로 이동하며 다른 모든 것은 원시 값 또는 다른 객체 노드를 가진 서브 노드 일뿐입니다.

jsonxmlconverter.java

용법: JsonObject sampleJson = sampleJson(); org.w3c.dom.Document domNode = JsonXmlConverter.getW3cDocument(sampleJson, "root");

아직 주어지지 않은 한 가지 방법은 파서 생성기를 사용하여 XSLT에 Parser를 만들어 JSON을 구문 분석하고 XML 출력을 생성하는 것입니다.

XML 컨퍼런스에서 많이 언급되는 옵션 중 하나는 Rex Parser Generator입니다.http://www.bottlecaps.de/rex/) - 사이트에서 완전히 문서화되지 않았지만 검색시 레시피를 사용할 수 있습니다.

JSON과 함께 XSLT를 사용하는 것이 가능할 수도 있습니다.XPath(3.1) XSLT(3.0) 및 XQuery(3.1) 버전 3은 어떤 방식으로든 JSON을 지원합니다.이것은 Saxon의 상용 버전에서 사용 가능한 것으로 보이며, 어느 시점에서는 HE 버전에 포함될 수도 있습니다.https://www.saxonica.com/html/documentation/functions/fn/parse-json.html

-

대체 솔루션에서 기대할 수 있는 사항은 다음과 같습니다.

JSON을 입력하여 일치하는 데이터 세트를 가져오고 JSON 또는 TEXT를 출력할 수 있기를 원합니다.

임의의 속성에 액세스하고 값을 평가합니다.

조건부 논리 지원

변환 스크립트가 도구 외부에 있고 텍스트 기반이며 일반적으로 사용되는 언어인 것이 바람직합니다.

잠재적인 대안?

SQL이 적합한 대안이 될 수 있는지 궁금합니다.https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

대체 도구가 JSON 및 XML을 처리할 수 있다면 좋을 것입니다.https://docs.microsoft.com/en-us/sql/relational-databases/xml/openxml-sql-server

아직 사용하는 XSLT 스크립트를 SQL로 변환하려고 시도하지 않았거나 이 옵션을 완전히 평가해 본 적은 없지만 더 빨리 조사해 보고 싶습니다.지금까지는 몇 가지 생각만 했습니다.

JSON-E Node.js, Python 및 Go에 구현이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top