JSON के लिए XSLT बराबर


15

मुझे JSON के समकक्ष एक XSLT खोजने (या यदि आवश्यक हो तो विकास) में दिलचस्पी थी।

जैसा कि मुझे कोई नहीं मिला है, मैं JSON के रास्तों के मिलान के लिए उपयोग करने के लिए संभावित क्वेरी भाषा पर विचार कर रहा था ताकि टेम्पलेट (जावास्क्रिप्ट से) लागू हो सके जब एक मैच था (शायद सिर्फ क्रम में मिलान पैटर्न की एक सरणी की जांच कर रहा था, और उसी पर रोक रहा था पहला टेम्प्लेट जो मिलान के लिए अनुमति देता है, हालांकि xsl के बराबर होने की अनुमति देता है: बच्चों के लिए चल रहे टेम्प्लेट को रखने के लिए लागू करें)।

मैं JSONPath, JSONQuery और RQL से JSON क्वेरी भाषाओं के बारे में जानता हूं (हालांकि मैं इस बात पर पूरी तरह से स्पष्ट नहीं था कि RQL ने पूर्ण और सापेक्ष पथों का समर्थन किया है)। इस तरह के एक उपयोग की ओर प्रत्येक के फायदे और विचार करने के लिए कारकों पर कोई सुझाव।


बस एक यादृच्छिक विचार, जावास्क्रिप्ट और मूंछें / हैंडल शायद? :)
केंडर्ड

धन्यवाद, लेकिन मैं एक मानक दृष्टिकोण का उपयोग करने के लिए अधिक उत्सुक हूं (उदाहरण के लिए, क्षमता के साथ कम से कम एक, यह देखते हुए कि सामान्य JSON पथ अभिव्यक्तियाँ JSON को संदर्भित करने का एक सामान्य रूप से मान्यता प्राप्त साधन होगा, जो कि लाइब्रेरी के लिए कुछ सिंटैक्स विशिष्ट के विपरीत है)।
ब्रेट ज़मीर


1
मुझे यह भी दिलचस्प लगा: json-template.googlecode.com/svn/trunk/doc/…
रॉबर्ट हार्वे

मैंने Json -> XML -> XSLT -> Json से पहले किया है - यह ठीक काम करता है, भले ही यह सबसे कुशल समाधान न हो,
user2813274

जवाबों:


27

XML: XSLT :: JSON: xX क्या है ?

सबसे सुस्पष्ट उत्तर x = जावास्क्रिप्ट होगा। हालांकि आप इसके लिए एक मामला बना सकते हैं, यह असंतोषजनक लगता है। भले ही XSLT तकनीकी रूप से ट्यूरिंग पूर्ण हो , लेकिन XSLT की घोषित शैली और जावास्क्रिप्ट में देखी जाने वाली अधिक अनिवार्य या कार्यात्मक शैलियों के बीच एक खराब पत्राचार है ।

JSONPath , JSONiq और RQL जैसी कुछ स्टैंडअलोन JSON क्वेरी भाषाएँ हैं, जो XML के मध्य मैदान के लिए खड़ी हो सकती हैं: XPath :: JSON: y (या संभवतः, XPath के बजाय XQuery)। और हर JSON-केंद्रित दस्तावेज़ डेटाबेस में JSON से संबंधित क्वेरी भाषा होती है

लेकिन वास्तविकता यह है कि पूर्ण XSLT की स्थिति के लिए कुछ दावेदार होने के बावजूद, जैसे कि SpahQL , आम तौर पर स्वीकार नहीं किए जाते हैं, मोटे तौर पर XSONT के JSON समकक्षों का समर्थन करते हैं।

क्यों?

दुनिया के सभी JSON के साथ, XSLT के अनुरूप (अधिक प्रत्यक्ष) एनालॉग क्यों नहीं है? क्योंकि कई डेवलपर्स XSLT को एक असफल प्रयोग के रूप में देखते हैं। कोई भी खोज इंजन "XSLT दर्द में लिपटी एक विफलता है" जैसे उद्धरणों को जन्म देगा। दूसरों ने तर्क दिया है कि अगर यह सिर्फ बेहतर स्वरूपित होता, तो यह अधिक लोकप्रिय होता। लेकिन XSLT में रुचि आम तौर पर वर्षों में कम हो गई है । कई उपकरण जो इसका समर्थन करते हैं वे केवल संस्करण 1.0 का समर्थन करते हैं , जो कि 1999 का विनिर्देश है। पंद्रह साल पुराना चश्मा? बहुत नया 2.0 का अनुमान है, और अगर लोग एक्सएसएलटी के बारे में उत्साहित थे, तो इसका समर्थन किया जाएगा। यह नहीं है।

द्वारा और बड़े डेवलपर्स ने कोड के साथ एक्सएमएल दस्तावेजों को संसाधित करने और बदलने के लिए चुना है, न कि परिवर्तन टेम्पलेट्स। इसलिए यह बहुत ही आश्चर्यजनक है कि जब JSON के साथ काम कर रहे हैं, तो वे एक अतिरिक्त "विदेशी" परिवर्तन प्रणाली को जोड़ने के बजाय अपनी मूल भाषा में ऐसा करना और चुनना भी चाहेंगे।


2
+1 जैसा कि यह एक विचारोत्तेजक उत्तर है, लेकिन मुझे अभी भी लगता है कि यह लीनियरली व्यवस्थित टेंपलेट्स का एक गुच्छा है जो लाइब्रेरी के साथ कदम से कदम मिलाकर चल रहा है, और जबकि मुझे लगता है कि आप शायद XSL (I की ओर रुख के बारे में सही हैं) शिविर में दुबारा सोचें कि यह एक प्रारूपण का मुद्दा है, हालांकि पुनरावर्ती शैली को स्वीकार करने की आवश्यकता है कि कुछ अनुकूलन की आवश्यकता है), मुझे यकीन है कि इस समस्या का उपयोग करने के लिए इस तरह की भाषा विकसित करने की आवश्यकता में कुछ जड़ता हो सकती है (जैसे, मुझे लग रहा है यहां तक ​​कि JSONPath को भी कुछ वृद्धि की आवश्यकता है)।
ब्रेट ज़मीर

SpahQL के पास अपने स्वयं के टेम्पलेट नहीं थे, इसलिए यह अभी भी लगता है कि कोई दावेदार नहीं हैं जो वास्तव में टेम्पलेट कोड (डेटा संरचनाओं के साथ) के लिए शुद्ध जावास्क्रिप्ट या JSON का उपयोग करते हैं, भले ही पुस्तकालय हैं जो HTML की अभिव्यक्ति JSON / के रूप में अनुमति देते हैं जे एस।
ब्रेट ज़मीर

1
+1 इस तथ्य के बावजूद कि XSLT के बारे में ऐसा कुछ है जो और कुछ नहीं है जो दोहराने के लिए प्रबंधन करता है। JSON निश्चित रूप से के साथ एक प्रयोग करने योग्य लिखने के लिए एक कठिन वाक्यविन्यास होने जा रहा है।
user52889

7

जबकि जोनाथन मोटे तौर पर अपने जवाब में भाषा के रूप में एक्सएसएलटी की प्रकृति के बारे में बात करते हैं, मुझे लगता है कि विचार करने के लिए एक और कोण है।

XSLT का उद्देश्य XML दस्तावेज़ों को कुछ अन्य दस्तावेज़ (XML, HTML, SGML, PDF, आदि) में बदलना था। इस तरह, XSLT अक्सर एक टेम्पलेट भाषा के रूप में, प्रभावी ढंग से उपयोग किया जाता है।

यदि आप अपने आप को जावास्क्रिप्ट पुस्तकालयों तक सीमित रखते हैं, तब भी टेम्पलेट लायब्रेरीज़ का एक विशाल सरणी होता है (जिसे आपको इसकी आवश्यकता नहीं होनी चाहिए, क्योंकि जेएसएन में जेएस केवल संकेतन की उत्पत्ति को संदर्भित करता है और इसका मतलब यह नहीं लिया जाना चाहिए कि JSON केवल जावास्क्रिप्ट के लिए है)। यह टेम्प्लेट इंजन चयनकर्ता देता है और जेएस विकल्पों की विविधता के संकेत देता है।

आपके प्रश्नों के उत्तरार्द्ध में क्वेरी भाषाओं के बारे में अधिक बात की गई है और इनमें से XML संस्करण XPath (XSLT नहीं) होगा। जैसा कि आपने उल्लेख किया है, वहाँ विभिन्न प्रकार के विकल्प हैं और मुझे उस सूची में जोड़ने के लिए कुछ भी नहीं है। यह क्षेत्र अपेक्षाकृत नया है, इसलिए मेरा सुझाव है कि आप इसे चुनें और बस इसके साथ जाएं।


यदि कोई संदेह है, तो मुझे लगता है कि जोनाथन का जवाब बहुत अच्छा है; मैं सिर्फ एक वैकल्पिक परिप्रेक्ष्य जोड़ना चाहता था।
Dancrumb

हाँ, उचित बिंदु (और हाँ फिर से: XPath दूसरे भाग के लिए बराबर है), लेकिन मैं अपने JS XSL (इसे JTLT कहते हुए) को देखने में दिलचस्पी रखता हूं, एक बढ़ाया JSONPath JSON को दूसरी भाषा में भी परिवर्तित कर सकता है (यानी, HTML के रूप में HTML स्ट्रिंग या डोम)।
ब्रेट ज़मीर

मेरी अपनी लाइब्रेरी है जिसे जमीलह कहा जाता है, जिसे मैं कच्चे HTML को JS / JSON के रूप में व्यक्त करने के पक्ष में हूं, लेकिन मुझे स्वाभाविक रूप से कुछ महसूस करने की आवश्यकता है और मुझे आशा है कि 1 के लिए आकर्षक) टेम्पलेट और पथ मिलान 2) Isating APIs xsl के बराबर: apply-templates और xsl: कॉल-टेम्प्लेट (xsl: for-प्रत्येक JS के लिए स्पष्ट है, लेकिन JSON नहीं)। जेएस के लिए, मैं टेम्प्लेट्स के लिए, और JSON (जामिलिह और उन पुनरावृत्तियों पर आधारित) के लिए फ़ंक्शंस का उपयोग कर सकता हूं। विल्स ee यह कैसे जाता है ...
ब्रेट ज़मीर

3

यहाँ कुछ उदाहरण दिए गए हैं कि आप मेरे साथ क्या कर सकते हैं (छोटा [jslt.min.js] ) JSLT - जावास्क्रिप्ट लाइटवेट ट्रांसफ़ॉर्म:

https://jsfiddle.net/YSharpLanguage/c7usrpsL/10

( (jslt.min.js] का वजन ~ 3.1kb की दर से घटाया गया )

यह सिर्फ एक कार्य है,

function Per ( subject ) { ... }

... जो वास्तव में XSLT (1.0) प्रसंस्करण मॉडल की नकल करता है

(cf. "ट्रांसफॉर्म" और "टेम्प्लेट" आंतरिक कार्य, प्रति शरीर में)

तो, संक्षेप में, यह सिर्फ उस एकल में बेक किया गया है function Per ( subject ) { ... }जो इसके (इसके भी) अनूठे तर्क के प्रकार पर अपना मूल्यांकन करने के लिए लागू करता है, या तो:

1) ऐरे विषय

नोडसेट निर्माण / फ़िल्टरिंग / फ़्लैटनिंग / ग्रुपिंग / ऑर्डरिंग / आदि , यदि विषय एक सरणी है, जहां परिणामी नोडसेट (एक एरे के रूप में अच्छी तरह से) बढ़ाया जाता है, और तदनुसार नामित विधियों के लिए बाध्य होता है ( केवल लौटाए गए एरे का उदाहरण कॉल के लिए Per ( subjectArray )है) विस्तारित; अर्थात, Array.prototype को छोड़ दिया गया है)

यानी, प्रति :: ऐरे --> ऐरे

(परिणामी एरे के विस्तार के तरीकों में स्व-व्याख्यात्मक नाम जैसे, GroupBy, ऑर्डरबाय, फ्लैटनबी, आदि - cf. उदाहरणों में उपयोग)

2) स्ट्रिंग विषय

स्ट्रिंग प्रक्षेप , यदि विषय एक स्ट्रिंग है

("प्रति" तब एक विधि के साथ एक वस्तु लौटाता है map ( source ), जो विषय टेम्पलेट स्ट्रिंग से बंधा है )

अर्थात, प्रति :: स्ट्रिंग --> {मानचित्र :: ( AnyValue --> स्ट्रिंग )}

जैसे,

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 )विषय से जुड़ी विधि के साथ एक वस्तु देता है रूपांतर - जहाँ

"रूलनाम" Per ( subjectTransform [ , ruleName ])वैकल्पिक है और <xsl: call-template name = "templateName"> ... के समान कार्यक्षमता प्रदान करता है ...)

यानी, प्रति :: ( ट्रांसफॉर्म [, रूलनेम: स्ट्रिंग ]) -->{मैप :: ( 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 === function ( value ) { return value ; })

ध्यान दें

ऊपर (3), टेम्पलेट फ़ंक्शन के शरीर में एक जावास्क्रिप्ट का "यह" इस प्रकार कंटेनर / मालिक ट्रांसफॉर्म और उसके नियमों के सेट ($ द्वारा परिभाषित किया गया है के लिए बाध्य है : [...] सरणी) - इसलिए,) उस संदर्भ में "प्रति (यह)" अभिव्यक्ति बनाते हुए, XSLT के बराबर एक कार्यात्मक रूप से करीब

<xsl:apply-templates select="..."/>

'HTH,


1
यह बहुत मजेदार है।
रॉबर्ट हार्वे

@RobertHarvey: इसके अलावा खंड 5.1 में और स्वयं में जो मैंने बहुत पहले नोटिस किया था, उसके अंत में, मैं भी अंततः साज़िश से प्रेरित और इवान लेनज़ की आकर्षक टिप्पणी "XSLT आपके विचार से आसान है!", Http: // www पर। lenzconsulting.com/how-xslt-works - और इसलिए मैंने उस दावे को सत्यापित करने के लिए एक शॉट देने का फैसला किया (यदि केवल जिज्ञासा से बाहर है) बहुत ही निंदनीय भाषा है जो जावास्क्रिप्ट है।
YSharp

आपके विस्तृत उत्तर के लिए बहुत-बहुत धन्यवाद। मैं कुछ अन्य चीजों (अपने खुद के एक्सएसएलटी समतुल्य सहित) के साथ व्यस्त हूं, लेकिन मैं और अधिक ध्यान रखने के लिए इसे वापस लाने का इरादा रखता हूं।
ब्रेट ज़मीर

3

मैंने हाल ही में इस उद्देश्य के लिए एक पुस्तकालय, जोंस-ट्रांसफ़ॉर्म बनाया है :

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

यह JSPath के संयोजन का उपयोग करता है , XPath पर एक डीएसएल मॉडल और एक पुनरावर्ती पैटर्न मिलान दृष्टिकोण, जो सीधे 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गुणों का उत्पादन करता है। अंतिम पहचान परिवर्तन है जो पुनरावर्ती मेल खाता है।


जानकारी के लिए +1 और धन्यवाद। मैं अपने खुद के github.com/brettz9/jtlt को किसी बिंदु पर पूरा होने की उम्मीद कर रहा हूं , लेकिन तुलना करने के लिए अधिक कार्यान्वयन करना सहायक है।
ब्रेट ज़मीर

-1

मुझे नहीं लगता कि आपको कभी JSON प्रति se के लिए JSON वेरिएंट मिलेगा। कई अस्थायी इंजन मौजूद हैं जैसे कि पायथन का जिंजा 2, जावास्क्रिप्शंस ननजक्स, ग्रूवी मार्कअपटेम्पप्लेटाइन, और कई अन्य जो आपको चाहिए के लिए अच्छी तरह से अनुकूल होना चाहिए। .NET में T4 और JSON सीरियलाइज़ेशन / डीसर्लाइज़ेशन सपोर्ट है ताकि आपके पास भी ऐसा हो।

चूँकि derserialized JSON डेटा मूल रूप से एक शब्दकोश या मानचित्र संरचना होगी, जो कि बस आपके टेंपलेटिंग इंजन के पास जाएगी और आप वहां वांछित नोड्स पर पहुंच जाएंगे। JSON डेटा तब टेम्पलेट द्वारा रूपांतरित हो जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.