जवाबों:
<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>
) या नहीं। ये उन्नत उपयोग हैं और जब आप वहां पहुंचेंगे तो आप उनसे निपट सकते हैं।
<xsl:apply-templates>
एक पाश की तरह व्यवहार करता है। XSLT प्रोसेसर के अंत में कार्यान्वयन अंतर मुझे XSLT प्रोग्रामर के रूप में प्रभावित नहीं करेगा, परिणाम समानांतर और पुनरावृत्त कार्यान्वयन के लिए बिल्कुल समान है। लेकिन एक अनिवार्य पृष्ठभूमि के साथ एक XSLT नौसिखिया के लिए, यह <xsl:apply-templates>
प्रत्येक लूप के एक प्रकार के रूप में कल्पना करने में मदद करता है , भले ही - तकनीकी रूप से - यह नहीं है।
@Tomalak द्वारा अच्छे उत्तर में जोड़ने के लिए:
यहाँ कुछ असंबद्ध और महत्वपूर्ण अंतर हैं :
xsl:apply-templates
की तुलना में बहुत अमीर और गहरा है , xsl:call-templates
यहां तक कि xsl:for-each
क्योंकि हम नहीं जानते कि किस कोड को चयन के नोड्स पर लागू किया जाएगा - सामान्य स्थिति में यह कोड नोड-सूची के विभिन्न नोड्स के लिए अलग होगा।
जिस कोड को लागू किया जाएगा, वह 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
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 नोड के सभी बच्चों के लिए सभी टेम्पलेट लागू करता है जिसका नाम 'नोड्स' है।
कार्यक्षमता वास्तव में समान है (कॉलिंग शब्दार्थ के अलावा, जहां call-template
एक name
विशेषता और इसी नाम के टेम्पलेट की आवश्यकता होती है )।
हालांकि, पार्सर उसी तरह निष्पादित नहीं करेगा।
से MSDN :
इसके विपरीत
<xsl:apply-templates>
,<xsl:call-template>
वर्तमान नोड या वर्तमान नोड-सूची को नहीं बदलता है।
<xsl:apply-templates>
इसे लूप के रूप में लागू किया जाना चाहिए - इसके विपरीत, इसे समानांतर में लागू किया जा सकता है, क्योंकि नोड-सूची के विभिन्न नोड्स पर अलग-अलग अनुप्रयोग एक-दूसरे से बिल्कुल स्वतंत्र हैं।