2011-04-29 10 views
9

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

+0

अच्छा प्रश्न, +1। स्पष्टीकरण, तुलना और सिफारिश के लिए मेरा उत्तर देखें। –

उत्तर

1

मुझे डिमिट्रे की प्रतिक्रिया मिली - http://www.stylusstudio.com/xsllist/200811/post00400.html - सहायक।

<xsl:function/> का उपयोग कर के लाभ:

  1. Composability।

  2. वापसी मान या आंशिक एप्लिकेशन के रूप में पैरामीटर के रूप में इसका उपयोग करने वाली अभिव्यक्ति में बहुत अच्छा लगता है।

  3. पठनीयता (कॉम्पैक्टनेस) और रखरखाव।

  4. अधिक ढीला संयोजन (एक अंतर्निहित संदर्भ नोड पर निर्भर नहीं करता है)

  5. एक XPath अभिव्यक्ति में संदर्भित किया जा सकता है

कमियों:

  1. पैरामीटर हैं केवल स्थिति द्वारा पहचाना गया (नाम से नहीं)

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

मैं हमेशा <xsl:function/> का उपयोग करता हूं। उन मामलों में जब फ़ंक्शन नया नोड बनाता है, तो के स्ट्रिंग "मेक" के साथ makePerson() के साथ स्थानीय नाम शुरू करने के बाद मैं के सम्मेलन का पालन करता हूं।

2

संकल्पनात्मक xsl:apply-templates आपके द्वारा घोषित सभी नियमों के लिए व्यक्त एक पॉलिमॉर्फिक फ़ंक्शन वाला नक्शा है। xsl:function एक "नियमित" फ़ंक्शन घोषित करता है जिसका उपयोग आप किसी भी अन्य निर्देश या XPath अभिव्यक्तियों को स्वीकार करने की घोषणा में कर सकते हैं। xsl:call-template निर्देश एक विशेष नामित टेम्पलेट "invokes" (आप इसे किसी तरह से एक समारोह के रूप में सोच सकते हैं)।

क्योंकि इस बात में अंतर है कि प्रत्येक में मूल्यांकन संदर्भ कैसे शामिल होता है: xsl:apply-templates एक नई संदर्भ सूची को परिभाषित करता है जिससे संदर्भ नोड को निकटता स्थिति के साथ लिया जाता है; xsl:function में संदर्भ नोड परिभाषित नहीं है (यह उस पर भरोसा करने में त्रुटि है); xsl:call-template मूल्यांकन संदर्भ नहीं बदलता है।

अन्य स्पष्ट अंतर आउटपुट के साथ उनके संबंध हैं: xsl:apply-templates और xsl:call-template दोनों XSLT निर्देशों के निर्माण के अनुक्रम के रूप में; XPath अभिव्यक्ति के हिस्से के रूप में xsl:function यह नहीं करता है।

+0

@Alejandro: मुझे आपके उत्तर में दो बयान मिलते हैं जो समस्याग्रस्त हैं (बिल्कुल सही नहीं)। 1) "' xsl: function' में संदर्भ नोड परिभाषित नहीं है (यह उस पर भरोसा करने में त्रुटि है); "यह कहना अधिक सटीक है कि XSLT प्रोसेसर को एक त्रुटि सिग्नल करना चाहिए यदि शरीर में एक सापेक्ष XPath अभिव्यक्ति का सामना करना पड़ता है समारोह का 2) "xsl: XPath अभिव्यक्ति के हिस्से के रूप में कार्य करता है यह नहीं करता है। (एक निर्मित अनुक्रम आउटपुट)"। यह सच नहीं है। एक 'xsl: function' नोड्स बना सकता है और उन्हें वापस कर सकता है - मैं इस तकनीक का उपयोग करता हूं। हां, एक 'xsl: function' के दुष्प्रभाव हो सकते हैं। –

+0

@ डिमिट्री: http://www.w3.org/TR/xslt20/#stylesheet-functions _ "स्टाइलशीट फ़ंक्शन के बॉडी के भीतर, फ़ोकस प्रारंभ में अनिर्धारित है; इसका मतलब है कि संदर्भ आइटम का संदर्भ देने का कोई भी प्रयास, संदर्भ स्थिति, या संदर्भ आकार एक गैर-पुनर्प्राप्तिशील गतिशील त्रुटि है। "_ लगभग दो: यह फ़ंक्शन नहीं है जो परिणाम पेड़ पर आउटपुट कर रहा है, लेकिन XSLT निर्देश। साइड इफेक्ट्स के बारे में, अच्छी तरह से, यह विवादित हो सकता है: परिणामस्वरूप नए नोड्स बनाने वाले फ़ंक्शन भी एक ही तर्क के लिए एक ही परिणाम का निर्माण करेंगे, इसके अलावा इसमें एक ही नोड पहचान नहीं हो सकती है। –

+0

@Dimitre: विषय के प्रकार: ऐसा लगता है कि एक बड़ा प्रतिस्थापन था जिसने 'xpath' के लिए सभी' xpathengines' टैग को बदल दिया है, संस्करण के लिए एट्रिब्यूशन को बदलना भी है (अगर मैंने 'xpathengines' के साथ टैग किया है तो यह कहता है कि मैंने इसे टैग किया है 'xpath' के साथ)। Http://meta.stackexchange.com/questions/89005/what-did-happen-with-xpathengines-and-xqueryengines-tags –

6

यह how I replied to a similar question लगभग 3 साल पहले है:

<xsl:function/> का उपयोग कर के लाभ:

  1. Composability।

  2. वापसी मान या आंशिक एप्लिकेशन के रूप में पैरामीटर के रूप में इसका उपयोग करने वाली अभिव्यक्ति में बहुत अच्छा लगता है।

  3. पठनीयता (कॉम्पैक्टनेस) और रखरखाव।

  4. अधिक ढीला संयोजन (एक अंतर्निहित संदर्भ नोड पर निर्भर नहीं करता है)

  5. एक XPath अभिव्यक्ति में संदर्भित किया जा सकता है

कमियों:

  1. पैरामीटर हैं केवल स्थिति द्वारा पहचाना गया (नाम से नहीं)

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

मैं हमेशा <xsl:function/> का उपयोग करता हूं। उन मामलों में जब फ़ंक्शन नया नोड बनाता है, तो के स्ट्रिंग "मेक" के साथ makePerson() के साथ स्थानीय नाम शुरू करने के बाद मैं के सम्मेलन का पालन करता हूं।

मैं केवल यह करने के लिए जोड़ सकते हैं:

हमेशा जब संभव हो उपयोग <xsl:function>

XPath 3.0 फ़ंक्शंस में भाषा का प्रथम श्रेणी डेटा प्रकार (उर्फ एचओएफ - उच्च-आदेश कार्य) है। उन्हें पैरामीटर के रूप में पारित किया जा सकता है या अन्य कार्यों से परिणाम के रूप में लौटाया जा सकता है।

यह नामित टेम्पलेट्स का उपयोग करने से आगे एक अविश्वसनीय रूप से शक्तिशाली छलांग है।

0
Templates are useful when you have the requirement to store the results of each recursion into a variable as a attribute (at the end of each recursion before calling the next). 

**Example:** 

    <xsl:variable name="test"> 
    <record> 
     <xsl:call-template name="templateRecursion"> 
       <xsl:with-param name="xyz" select="xyz"/> 
     </xsl:call-template> 
    <record> 
    </xsl:variable> 

**templateRecursion:** 

    <xsl:template name="templateRecursion"> 

    <!-- Do processing --> 
    <xsl:attribute name="" value="" 

    </xsl:template> 

So, the variable test will have 

    <record> 
    <attribute_name="" value=""/> 
     . 
     . 
    </record> 
संबंधित मुद्दे