XSL में 'कॉल-टेम्प्लेट' और 'अप्लाई-टेम्प्लेट' में क्या अंतर हैं?


119

मैं XSLT में नया हूँ इसलिए मैं दो टैग के बारे में थोड़ा भ्रमित हूँ,

<xsl:apply-templates name="nodes">

तथा

<xsl:call-template select="nodes"> 

तो क्या आप उनके बीच के अंतर को सूचीबद्ध कर सकते हैं?

जवाबों:


167

<xsl:call-template> एक पारंपरिक प्रोग्रामिंग भाषा में एक फ़ंक्शन को कॉल करने के बराबर है।

आप XSLT में फ़ंक्शन को परिभाषित कर सकते हैं, जैसे कि यह सरल एक स्ट्रिंग को आउटपुट करता है।

<xsl:template name="dosomething">
  <xsl:text>A function that does something</xsl:text>
</xsl:template>

इस फ़ंक्शन के माध्यम से बुलाया जा सकता है <xsl:call-template name="dosomething">

<xsl:apply-templates>थोड़ा अलग है और इसमें XSLT की असली शक्ति है: यह किसी भी संख्या में XML नोड्स लेता है (जो भी आप selectविशेषता में परिभाषित करते हैं), उन्हें पुनरावृत्त करता है ( यह महत्वपूर्ण है: आवेदन-टेम्पलेट एक लूप की तरह काम करता है! ) और मिलान मिलान को पाता है। उनके लिए:

<!-- sample XML snippet -->
<xml>
  <foo /><bar /><baz />
</xml>

<!-- sample XSLT snippet -->
<xsl:template match="xml">
  <xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>

<xsl:template match="foo"> <!-- will be called once -->
  <xsl:text>foo element encountered</xsl:text>
</xsl:template>

<xsl:template match="*"> <!-- will be called twice -->
  <xsl:text>other element countered</xsl:text>
</xsl:template>

इस तरह से आप XSLT प्रोसेसर पर थोड़ा नियंत्रण छोड़ देते हैं - न कि आप तय करते हैं कि प्रोग्राम का प्रवाह कहां जाता है, लेकिन प्रोसेसर वर्तमान में प्रसंस्करण कर रहे नोड के लिए सबसे उपयुक्त मैच ढूंढकर करता है।

यदि कई टेम्प्लेट नोड से मेल कर सकते हैं, तो अधिक विशिष्ट मैच एक्सप्रेशन जीतता है। यदि समान विशिष्टता के साथ एक से अधिक मिलान टेम्पलेट मौजूद हैं, तो एक अंतिम जीत घोषित करता है।

आप विकासशील टेम्पलेट्स पर अधिक ध्यान केंद्रित कर सकते हैं और "प्लंबिंग" करने के लिए कम समय की आवश्यकता होती है। आपके कार्यक्रम अधिक शक्तिशाली और मॉड्यूलर बनेंगे, कम गहराई से नेस्टेड और तेज़ (जैसे XSLT प्रोसेसर टेम्पलेट मिलान के लिए अनुकूलित हैं)।

XSLT के साथ समझने की अवधारणा "वर्तमान नोड" की है। साथ <xsl:apply-templates>हर यात्रा के साथ पर वर्तमान नोड चलता है, जबकि <xsl:call-template>वर्तमान नोड नहीं बदलता है। यानी .एक टेम्पलेट के भीतर .कॉलिंग टेम्प्लेट के समान नोड को संदर्भित करता है । यह लागू-टेम्पलेट के मामले में नहीं है।

यही मूल अंतर है। टेम्पलेट्स के कुछ अन्य पहलू हैं जो उनके व्यवहार को प्रभावित करते हैं: उनका modeऔर priority, तथ्य यह है कि टेम्पलेट में ए nameऔर ए दोनों हो सकते हैं match। इसका भी प्रभाव पड़ता है कि क्या टेम्पलेट आयात किया गया है ( <xsl:import>) या नहीं। ये उन्नत उपयोग हैं और जब आप वहां पहुंचेंगे तो आप उनसे निपट सकते हैं।


5
@Tomalak: अच्छा जवाब! हालाँकि, कथन: "xsl: apply-templates एक पाश है" सही नहीं है। किसी भी आधिकारिक W3C कल्पना में कोई संकेत नहीं है कि <xsl:apply-templates>इसे लूप के रूप में लागू किया जाना चाहिए - इसके विपरीत, इसे समानांतर में लागू किया जा सकता है, क्योंकि नोड-सूची के विभिन्न नोड्स पर अलग-अलग अनुप्रयोग एक-दूसरे से बिल्कुल स्वतंत्र हैं।
दिमित्रे नोवत्चेव

8
@Dimitre: मेरे कहने का मतलब: अंत उपयोगकर्ता के दृष्टिकोण से, <xsl:apply-templates>एक पाश की तरह व्यवहार करता है। XSLT प्रोसेसर के अंत में कार्यान्वयन अंतर मुझे XSLT प्रोग्रामर के रूप में प्रभावित नहीं करेगा, परिणाम समानांतर और पुनरावृत्त कार्यान्वयन के लिए बिल्कुल समान है। लेकिन एक अनिवार्य पृष्ठभूमि के साथ एक XSLT नौसिखिया के लिए, यह <xsl:apply-templates>प्रत्येक लूप के एक प्रकार के रूप में कल्पना करने में मदद करता है , भले ही - तकनीकी रूप से - यह नहीं है।
टॉमालक

@Tomalak: हालांकि यह नौसिखिया XSLT प्रोग्रामर के लिए उपयोगी हो सकता है, मुझे लगता है कि यह अक्सर उनके लिए भ्रामक होता है क्योंकि उन्हें लगता है कि वे "लूप के निष्पादन" में संचित राज्य सूचना का फिर से उपयोग कर सकते हैं।
दिमित्रे नोवाचेव

@ टोमलाक: इन तथ्यों के कारण, मुझे लगता है कि "xsl: apply- टेम्प्लेट्स को संशोधित करना उचित होगा" जैसे कि somethinkg के साथ: "xsl: apply-templates एक लूप की तरह है"
Dimit Novatchev

@ टोमलाक: लूप पुनरावृत्ति है, कुछ apply-templatesऔर call-templateनिर्देश नहीं हैं। वे XSLT में पुनरावर्तन तंत्र हैं। और जैसा कि दिमित्रे ने उत्तर दिया है, आवेदन-टेम्पलेट्स बहुरूपता या डेटा चालित तंत्र है।

15

@Tomalak द्वारा अच्छे उत्तर में जोड़ने के लिए:

यहाँ कुछ असंबद्ध और महत्वपूर्ण अंतर हैं :

  1. xsl:apply-templatesकी तुलना में बहुत अमीर और गहरा है , xsl:call-templatesयहां तक ​​कि xsl:for-each क्योंकि हम नहीं जानते कि किस कोड को चयन के नोड्स पर लागू किया जाएगा - सामान्य स्थिति में यह कोड नोड-सूची के विभिन्न नोड्स के लिए अलग होगा।

  2. जिस कोड को लागू किया जाएगा, वह xsl:apply templateएस लिखे जाने के बाद और मूल लेखक को नहीं जानने वाले लोगों द्वारा लिखा जा सकता है

यदि XSLT के पास <xsl:apply-templates>निर्देश नहीं है तो XSLT में उच्च-ऑर्डर फ़ंक्शंस (HOF) का FXSL लाइब्रेरी कार्यान्वयन संभव नहीं होगा

सारांश : टेम्पलेट और <xsl:apply-templates>निर्देश यह है कि XSLT कैसे लागू होता है और बहुरूपता से संबंधित है।

संदर्भ : इस पूरे धागे को देखें: http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/msg00546.html


8

xsl:apply-templatesआम तौर पर (लेकिन जरूरी नहीं) सभी नोड के बच्चों के लिए या सभी लागू किए गए टेम्पलेट्स के साथ एक सबसेट को संसाधित करने के लिए उपयोग किया जाता है । यह XSLT एप्लिकेशन की पुनरावृत्ति का समर्थन करता है जो संसाधित XML की (संभव) पुनरावृत्ति से मेल खा रहा है।

xsl:call-templateदूसरी ओर एक सामान्य फ़ंक्शन कॉल की तरह बहुत अधिक है। आप बिल्कुल एक (नामित) टेम्पलेट निष्पादित करते हैं, आमतौर पर एक या अधिक मापदंडों के साथ।

इसलिए मैं उपयोग करता हूं xsl:apply-templatesअगर मैं एक दिलचस्प नोड के प्रसंस्करण को रोकना चाहता हूं और (आमतौर पर) आउटपुट स्ट्रीम में कुछ इंजेक्ट करता हूं। एक विशिष्ट (सरलीकृत) उदाहरण होगा

<xsl:template match="foo">
  <bar>
    <xsl:apply-templates/>
  </bar>
</xsl:template>

जब xsl:call-templateमैं आम तौर पर कुछ उप-पाठों को एक साथ जोड़ने, पाठ या अन्य नोड्स में पाठ और अन्य नोड्स में परिवर्तित करने जैसी समस्याओं को हल करता हूं, जैसे - आप के लिए एक विशेष, पुन: प्रयोज्य कार्य लिखेंगे।

संपादित करें:

अपने विशिष्ट प्रश्न पाठ की अतिरिक्त टिप्पणी के रूप में:

<xsl:call-template name="nodes"/> 

इसे एक टेम्प्लेट कहते हैं जिसे 'नोड्स' नाम दिया गया है:

    <xsl:template name="nodes">...</xsl:template>

यह एक अलग शब्दार्थ है:

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

... जो आपके वर्तमान XML नोड के सभी बच्चों के लिए सभी टेम्पलेट लागू करता है जिसका नाम 'नोड्स' है।


2

कार्यक्षमता वास्तव में समान है (कॉलिंग शब्दार्थ के अलावा, जहां call-templateएक nameविशेषता और इसी नाम के टेम्पलेट की आवश्यकता होती है )।

हालांकि, पार्सर उसी तरह निष्पादित नहीं करेगा।

से MSDN :

इसके विपरीत <xsl:apply-templates>, <xsl:call-template>वर्तमान नोड या वर्तमान नोड-सूची को नहीं बदलता है।

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