سؤال

هناك XSLT أي ما يعادل JSON ؟ شيء اسمحوا لي أن تفعل التحولات على سلمان مثل XSLT لا إلى XML.

هل كانت مفيدة؟

المحلول

فكرة مثيرة للاهتمام.بعض البحث على جوجل المنتجة بضع صفحات من المصلحة ، بما في ذلك:

ويساعد هذا الأمل.

نصائح أخرى

JOLT . وهو JSON إلى JSON مكتبة التحول مكتوب بلغة جافا.

تم إنشاؤه خصيصا لأننا لم نكن نريد للعب "JSON -> XML -> XSLT -> XML -> JSON". اللعبة، وباستخدام قالب لأي مجمع بما فيه الكفاية تحويل هو غير قابل للدعم

XSLT في حكمه على JSON - قائمة من المرشحين (أدوات و مواصفات)

أدوات

  1. XSLT

    يمكنك استخدام XSLT عن سلمان بهدف fn:سلمان إلى xml.

    يصف هذا القسم مرافق السماح سلمان البيانات التي يتم معالجتها باستخدام XSLT.

  2. jq

    jq مثل sed عن البيانات JSON - يمكنك استخدامه لشريحة مرشح خريطة وتحويل البيانات المهيكلة بنفس السهولة التي sed, awk ، البقرى والأصدقاء تمكنك من اللعب مع النص.هناك تثبيت حزم مختلفة من نظام التشغيل.

  3. jj

    JJ هو أداة سطر الأوامر التي توفر طريقة سريعة وبسيطة لاسترداد أو تحديث القيم من سلمان الوثائق.انه مدعوم من قبل GJSON و SJSON تحت غطاء محرك السيارة.

  4. fx

    سطر الأوامر سلمان تجهيز أداة

    • لا تحتاج إلى معرفة جملة جديدة
    • عادي جافا سكريبت
    • التنسيق وإبراز
    • مستقل ثنائي
  5. jl

    jl ("سلمان لامدا") هو صغير وظيفية لغة الاستعلام عن والتلاعب JSON.

  6. هزة

    سلمان على سلمان التحول مكتبة مكتوب في جاوة حيث "مواصفات" من أجل تحويل هو نفسه سلمان الوثيقة.

  7. gron

    جعل سلمان greppable!gron يحول سلمان إلى مهام منفصلة لتسهيل البقرى على ما تريد و ترى المطلق 'مسار' إلى ذلك.انه يخفف الاستكشاف من واجهات برمجة التطبيقات التي يعود كبيرة النقط من JSON ولكن قد رهيب الوثائق.

  8. سلمان

    سلمان هو سريع CLI أداة للعمل مع سلمان.وهو ملف واحد node.js النصي مع عدم الخارجية deps (بخلاف node.js نفسها).

  9. json-e

    JSON-e البيانات هيكل والثوابت نظام التضمين في السياق كائنات JSON.الفكرة المركزية لعلاج بنية البيانات باعتبارها "قالب" وتحويلها باستخدام بيانات أخرى بنية السياق ، أن تنتج الانتاج بنية البيانات.

  10. JSLT

    JSLT كاملة الاستعلام والتحول لغة JSON.لغة تصميم مستوحى من jq, XPath, و XQuery.

  11. json-يحول آخر لارتكاب Dec 1, 2017

    يوفر العودية, نمط مطابقة نهج تحويل البيانات JSON.التحولات بأنها مجموعة من القواعد التي تتطابق بنية الكائن سلمان.عندما يحدث تطابق القاعدة تنبعث تحويل البيانات اختياريا recursing لتحويل الكائنات التابعة.

  12. jsawk آخر لارتكاب Mar 4, 2015

    Jsawk مثل awk ، ولكن JSON.كنت تعمل مع مجموعة من كائنات JSON قراءة من stdin تصفية لهم باستخدام جافا سكريبت لإنتاج نتائج مجموعة التي يتم طباعتها إلى المعياري.

  13. yate آخر لارتكاب Mar 13, 2017

    اختبارات يمكن استخدامها docu https://github.com/pasaran/yate/tree/master/tests

  14. jsonpath-كائن-تحويل آخر لارتكاب يناير 18, 2017

    تسحب البيانات من كائن الحرفي باستخدام JSONPath و إنشاء كائنات جديدة تستند إلى قالب.

  15. التدبيس آخر لارتكاب Sep 16, 2013

    تدبيس هي مكتبة جافا سكريبت التي تمكن XSLT تنسيق JSON الكائنات.بدلا من استخدام جافا سكريبت محرك النموذجيه و نص/html قوالب, التدبيس يعطيك فرصة استخدام XSLT قوالب تحميلها بشكل غير متزامن مع اياكس ثم التخزين المؤقت من جانب العميل - تحليل الخاص بك JSON datasources.

المواصفات:

  • JsonPointer

    سلمان المؤشر يحدد سلسلة بناء الجملة من أجل تحديد قيمة محددة داخل كائن جافا سكريبت التدوين (JSON) الوثيقة.

  • JsonPath

    JSONPath تعبيرات تشير دائما إلى سلمان هيكل في نفس الطريقة كما في تعبير XPath تستخدم في تركيبة مع مستند XML

  • JSPath

    JSPath عن سلمان مثل XPath لـ XML."

  • JSONiq

    إن مصدر الإلهام الرئيسي وراء JSONiq هو XQuery التي ثبت حتى الآن ناجحة ومثمرة لغة الاستعلام عن البيانات شبه الهيكلية

وXSLT يدعم JSON كما رأينا في http://www.w3.org/TR / XSLT 30 / # سلمان

يستخدم

وXML بين قوسين الزاوي للالرموز محدد، يستخدم JSON الأقواس، بين قوسين معقوفين، ... I. ه. عدد أقل من المقارنات اعتراف رمزي XML تعني انها الأمثل للتحول التعريفي، في حين أن المزيد من المقارنات، ويجري مثل بيان التبديل، لأسباب سرعة نفترض التنبؤ فرع المضاربة هذا الرمز الضروري في لغات البرمجة هو مفيد ل. كما كنتيجة مباشرة، ليمزج مختلفة من البيانات شبه منظمة، قد ترغب في XSLT القياسي وأداء جافا سكريبت محركات كجزء من صفحات استجابة. لحمولة البيانات لا تذكر، قد تعمل تحولات فقط، وكذلك مع JSON دون التسلسل XML. يجب قرار W3 على أن تقوم على تحليل أفضل.

ولقد وجدت مؤخرا أداة أنني أحب لJSON التصميم: https://github.com/twigkit/tempo . أداة سهلة جدا للاستخدام - في رأيي، انه من الاسهل بكثير للعمل مع من XSLT - لا حاجة للاستعلامات XPATH

JQ - سطر الأوامر خفيفة الوزن ومرنة JSON معالج

وانها ليست القالب المستندة إلى مثل XSLT، ولكن أكثر إيجازا. مثلا لاستخراج name وaddress الحقول إلى صفيف: [.name, .address]

تعليمي يمشي من خلال مثال تحويل JSON API التغريد (وفي دليل لديها العديد من الأمثلة).

وإلقاء نظرة على jsonpath وجوه تحويل

لنقول عدم وجود أدوات تشير إلى عدم وجود حاجة هو مجرد التسول السؤال. يمكن تطبيق نفس لدعم لX أو Y في لينكس (لماذا يزعج السائقين جودة تطوير و / أو الألعاب لمثل هذا OS أقلية؟ ولماذا تدفع الانتباه إلى OS تلك المباراة والأجهزة الشركات الكبيرة لا تتطور ل؟). ربما الناس الذين كانوا في حاجة إلى استخدام XSLT وJSON ينتهي باستخدام حلا تافهة إلى حد ما: تحويل JSON إلى XML. ولكن هذا ليس الحل الأمثل، أليس كذلك؟

وعندما يكون لديك شكل JSON الأصلي وتريد تحريره "wysywyg" في المتصفح، وسوف XSLT تكون أكثر من كافية حل لهذه المشكلة. يمكن القيام بذلك مع البرمجة جافا سكريبت التقليدية تصبح ألم في المؤخرة.

في الواقع، لقد نفذت نهج "العصر الحجري" لXSLT، وذلك باستخدام فرعية تحليل لتفسير بعض الأوامر الأساسية للجافا سكريبت، مثل استدعاء قالب، أطفال العملية، الخ تنفيذ بالتأكيد محرك التحول مع كائن JSON غير أسهل بكثير من تطبيق محلل XML كاملة لتحليل XSLT. المشكلة هي، أن استخدام قوالب XML لتحويل كائن JSON تحتاج إلى تحليل XML من القوالب.

لtranform كائن JSON مع XML (أو HTML أو نص أو أيا كان) تحتاج إلى التفكير مليا في بناء الجملة وما الأحرف التي تحتاج إلى استخدام لتحديد الأوامر التحول خاص. وإلا فسوف ينتهي بك الأمر إلى تصميم محلل للغة الخاصة النموذجيه المخصصة. وبعد أن سار في هذا الطريق، ويمكنني أن أقول لكم أنه ليست جميلة.

وتحديث (12 نوفمبر 2010): بعد بضعة أسابيع العمل على محلل نفسي، لقد كنت قادرا على تحسين ذلك. يتم تحليل القوالب مسبقا ويتم تخزين الأوامر ككائنات JSON. قواعد التحول هي أيضا كائنات JSON، في حين أن رمز قالب هو عبارة عن مزيج من HTML وبناء الجملة البيرة مماثل لقذيفة من التعليمات البرمجية. لقد كنت قادرا على تحويل وثيقة JSON المعقدة إلى HTML لجعل تحرير وثيقة. رمز حوالي 1K خطوط لمحرر (انها لمشروع خاص لذلك لا يمكن تقاسمها) وحول 990 خطوط لرمز التحول JSON (يتضمن أوامر التكرار، مقارنات بسيطة، داعيا القالب، وتوفير متغير والتقييم). أخطط لإصدارها تحت رخصة MIT. قطرة لي البريد إذا كنت ترغب في الحصول على المشاركة.

وكتبت مكتبتي الصغيرة الخاصة حول هذا، في الآونة الأخيرة، والذي يحاول البقاء أقرب إلى

5.1 تجهيز نموذج (XSLT REC) https://www.w3.org/TR/xslt#section-Processing-Model

ما هو ممكن (ما أستطيع على أية حال)، في بضعة أسطر من شفرة جافا سكريبت.

وفيما يلي بعض الأمثلة يست تافهة تماما من استخدام ...

1. JSON إلى بعض، العلامات:

وكمان: https://jsfiddle.net/YSharpLanguage/kj9pk8oz/10

و(مستوحاة من D.1 الوثيقة مثال (XSLT REC) <وأ href = "https://www.w3.org/TR/xslt#section-Document-Example" يختلط = " noreferrer "> 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 إلى 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 مقابل جافا سكريبت:

وA جافا سكريبت يعادل ...

XSLT 3.0 REC القسم 14.4 مثال: التجمع العقد على أساس القيم المشتركة

و(على العنوان التالي: http://jsfiddle.net/YSharpLanguage/8bqcd0ey/1 )

والتليف الكيسي. 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 مقابل جافا سكريبت:

وA جافا سكريبت يعادل ...

القسم JSONiq حالات استخدام 1.1.2. تجميع الاستفسارات لJSON

و(على العنوان التالي: https://jsfiddle.net/YSharpLanguage/hvo24hmk/3 )

والتليف الكيسي. 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 بخصوص. الاستعلام على محور الجد، والتي أثارها هذا السؤال SO (وبالتأكيد غيرها).

ومنها مثلا، كيفية الحصول على خصم بند البقالة معرفة هوية علامتها التجارية، في

{
 "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،

وهناك الآن! أنا خلقت مؤخرا مكتبة، أو سلمان-التحويلات ، أو بالضبط لهذا الغرض:

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

ويستخدم مزيجا من JSPath ، و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، ثم متكرر مطابقة. القاعدة الثانية مباريات أي كائن مع خاصية maker، إخراج model وyear خصائص. المباراة النهائية وهوية تحويل يطابق بشكل متكرر.

آخر جديد الإجابة على السؤال القديم, أقترح نظرة على DefiantJS.ليس XSLT أي ما يعادل عن سلمان ، هو 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>

ولقد كنت متعبا حقا لقدر هائل من محركات النموذجيه جافا سكريبت هناك، وكل ما لديهم مضمنة HTML-القوالب والأنماط ترميزية مختلفة، وما إلى ذلك، وقررت أن <لأ href = "https://github.com / WelcomWeb / تدبيس "يختلط =" نوفولو "> بناء مكتبة الصغيرة التي تمكن XSLT التنسيق لهياكل البيانات JSON. لا علم الصواريخ بأي شكل من الأشكال - انها مجرد تحليل JSON إلى XML ثم تنسيق مع وثيقة XSLT. إنه سريع جدا، وليس بالسرعة محركات قالب الجافا سكربت في كروم، ولكن في معظم المتصفحات الأخرى أنها على الأقل بأسرع البديل محرك JS لهياكل البيانات الكبيرة.

JSONiq عبارة مثل هذا المعيار و <لأ href = "http://www.zorba.io/ "يختلط =" نوفولو "> زوربا على C تنفيذ مفتوحة المصدر ++. يمكن أيضا أن ينظر JSONiq كما كسكيري مع إضافة JSON كنوع بيانات الأصلي.

وأنا أستخدم الجمل الطريق unmarshal (أكس سلمان) -> إلى (XSLT) -> مارشال (xmljson). فعالة بما فيه الكفاية (ولكن ليس 100٪ الكمال)، ولكنها بسيطة، إذا كنت تستخدم بالفعل الجمل.

وكان من الممكن جدا لتحويل JSON باستخدام XSLT: تحتاج JSON2SAX deserializer وSAX2JSON مسلسل

ونموذج التعليمات البرمجية في جافا: http://www.gerixsoft.com/blog/json/xslt4json

تم تصميم

والبوابة ( https://github.com/pasaran/yate ) على وجه التحديد بعد XSLT ويتميز JPath (ما يعادل كسباث الطبيعي JS)، يجمع إلى تفعيل جافا سكريبت ولا بأس به تاريخ استخدام الإنتاج. انها لا يحملون وثائق من الناحية العملية، ولكن يجب أن القراءة من خلال العينات والاختبارات تكون كافية.

JSLT هو قريب جدا إلى ما يعادل JSON من XSLT. انها تحويل اللغة حيث يمكنك كتابة جزء ثابت من الإنتاج في جملة 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
}

وانها تنفذ في جاوة على رأس جاكسون.

ولست متأكدا من أن هناك حاجة لذلك، وبالنسبة لي عدم وجود أدوات يوحي عدم وجود الحاجة إلى ذلك. من الأفضل معالجة JSON ككائنات (الطريقة انها فعلت في JS على أي حال)، والتي عادة ما تستخدم لغة الكائنات نفسها للقيام التحولات (جافا جافا الكائنات التي تم إنشاؤها من JSON، الشيء نفسه بالنسبة لبيرل، بايثون، بيرل، ج #، PHP وهكذا على). فقط مع المهام العادية (أو مجموعة، تحصل عليه)، حلقات وهلم جرا.

وأعني، XSLT هو مجرد لغة أخرى، وأحد الأسباب هو مطلوب هو أن XML ليس تدوين كائن وبالتالي الأشياء لغات البرمجة ليست نوبات الدقيقة (مقاومة بين نموذج أكس هرمية والأشياء / البنيات).

لماذا لا يحول JSON إلى XML باستخدام السيد Coverter البيانات ، tranform باستخدام XSLT ثم تغييره إلى JSON باستخدام نفس.

لوالعمل خربش / دليل على مفهوم نهج للاستفادة جافا سكريبت النقي جنبا إلى جنب مع النمط المألوف ومعلن وراء التعابير مطابقة XSLT وقوالب متكررة، انظر> وأ href = "https://gist.github.com/brettz9 / 0e661b3093764f496e36 "يختلط =" نوفولو "> https://gist.github.com/brettz9/0e661b3093764f496e36

و(يمكن اتخاذها نهجا مماثلا لJSON).

لاحظ أن التجريبي يعتمد أيضا على تفعيل جافا 1.8 إغلاق التعبير للراحة في التعبير عن القوالب في فايرفوكس (على الأقل حتى يمكن تنفيذها على شكل ES6 قصيرة للطرق).

تنويه: هذا هو رمز بلدي

.

وكتبت محول دوم لبلدي جاكسون إطار معالجة سلمان القائم منذ فترة طويلة. ويستخدم مكتبة nu.xom. وتعمل شجرة دوم الناتج مع كسباث جافا ومرافق XSLT. أنا جعلت بعض الخيارات التنفيذ التي هي واضحة جدا. على سبيل المثال هو عقدة الجذر يسمى دائما "الجذر"، صفائف الذهاب إلى عقدة رأ مع عناصر لى الفرعية (كما هو الحال في أتش تي أم أل)، وكل شيء آخر هو مجرد عقدة فرعية بقيمة البدائية أو عقدة كائن آخر.

JsonXmlConverter . JAVA

والاستخدام: JsonObject sampleJson = sampleJson(); org.w3c.dom.Document domNode = JsonXmlConverter.getW3cDocument(sampleJson, "root");

ونهج واحد لم تعط هو استخدام مولد محلل لخلق محلل في XSLT الذي يوزع JSON وتنتج يبلغ حجم انتاجها XML.

والخيار الوحيد الذي يحصل على ذكر الكثير في المؤتمرات XML هو محلل مولد ريكس ( HTTP: // شبكة الاتصالات العالمية .bottlecaps.de / ريكس / ) - على الرغم من أن موثقة تماما على الموقع، هي وصفات متوفرة على البحث

قد يكون من الممكن استخدام XSLT مع JSON.Verson 3 من XPath(3.1) XSLT(3.0) و XQuery(3.1) يدعم سلمان في بعض الطريق.ويبدو أن تتوفر النسخة التجارية من سكسونية ، وربما في مرحلة ما يتم تضمينها في الإصدار.https://www.saxonica.com/html/documentation/functions/fn/parse-json.html

-

ما أتوقع من حل بديل:

كنت تريد أن تكون قادرة على إدخال سلمان لجلب مجموعة مطابقة البيانات والمخرجات JSON أو النص.

الوصول التعسفي خصائص وتقييم القيم

دعم المنطق الشرطي

أريد تحويل البرامج النصية الخارجية من الأداة ، على أساس النص ، ويفضل أن تكون اللغة المستخدمة عادة.

المحتملة البديل ؟

أنا أتساءل عما إذا كان 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 الإلكترونية لها تطبيقات في نود.جي إس، بيثون والعودة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top