2010-12-20 5 views
60

क्या कोई मुझे xsl में टेम्पलेट के "मोड" के लिए उदाहरण दे सकता है?

<xsl:template name="temp_name" mode="mode"> 

mode का अर्थ क्या है? मैंने कई संसाधनों की खोज की, लेकिन मुझे इसके लिए उदाहरण नहीं मिला। तो क्या कोई उदाहरण के साथ समझा सकता है? अग्रिम में धन्यवाद।

+0

@ajreal। – Venkat

+0

अच्छा सवाल, +1। स्पष्टीकरण के लिए और एक पूर्ण कोड उदाहरण के लिए मेरा जवाब देखें। –

उत्तर

71

टेम्पलेट को एक नाम और एक मोड देने के लिए बहुत सार्थक नहीं है।

name विशेषता पूरी तरह से टेम्पलेट की पहचान करती है और एक ही नाम और विभिन्न मोड के साथ दो टेम्पलेट्स नहीं हो सकते हैं।

mode विशेषता विभिन्न मोड का उपयोग करके एक ही नोड्स को एक से अधिक संसाधित करने की अनुमति देती है।

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="num[position() mod 3 = 1]"> 
    <tr> 
    <xsl:apply-templates mode="copy" select= 
    ". | following-sibling::*[not(position() >2)]"/> 
    </tr> 
</xsl:template> 

<xsl:template match="*" mode="copy"> 
    <td><xsl:value-of select="."/></td> 
</xsl:template> 

<xsl:template match="num"/> 
</xsl:stylesheet> 

इस बदलाव निम्नलिखित XML दस्तावेज़ पर लागू किया जाता है:

यहाँ एक छोटी उदाहरण है

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

नतीजा यह है कि है संख्या तीन tr (में प्रदर्शित किए जाते हैं पंक्तियां), प्रत्येक में तीन कॉलम (अंतिम पंक्ति के संभावित अपवाद के साथ):

<tr> 
    <td>01</td> 
    <td>02</td> 
    <td>03</td> 
</tr> 
<tr> 
    <td>04</td> 
    <td>05</td> 
    <td>06</td> 
</tr> 
<tr> 
    <td>07</td> 
    <td>08</td> 
    <td>09</td> 
</tr> 
<tr> 
    <td>10</td> 
</tr> 

इस बदलाव में, उस रूप 3*k +1 (जहां k एक पूर्णांक है) में नहीं दर्शाया जा सकता स्थिति के साथ किसी भी num तत्व, खाली शरीर के साथ एक टेम्पलेट के अनुरूप है और इस तरह संसाधित नहीं है।

हालांकि, हम सभी num तत्वों को संसाधित करना चाहते हैं जो पंक्ति की कोशिकाओं को बनाना चाहिए।

<xsl:apply-templates mode="copy" select= 
". | following-sibling::*[not(position() >2)]"/> 

जिसका अर्थ है: "चयनित नोड्स टेम्पलेट्स कि सामान्य रूप से लागू किया जाएगा (कोई मोड में) के लिए लागू नहीं है, लेकिन लागू टेम्पलेट्स कि copy में हैं इस purpuse लिए, हम उन्हें xslt अनुदेश का उपयोग कर कार्रवाई कर रहे हैं मोड "

इस प्रकार, हम चयनित num तत्वों की अनदेखी नहीं है, लेकिन उन्हें copy मोड में कार्रवाई कर रहे हैं और एक पंक्ति के td रों बना रहे हैं।

टेम्पलेट नियम:

<xsl:template match="num"/> 

xslt builtin टेम्पलेट्स (डिफ़ॉल्ट प्रोसेसिंग) है कि अन्यथा num नोड्स जिसका स्थिति 3*k +1 के रूप में प्रतिनिधित्व नहीं किया जा सकता की स्ट्रिंग मूल्यों का कारण होगा ओवरराइड करने के लिए, उत्पादन होने के लिए आवश्यक है।

तो, इन नोड्स दोनों टेम्पलेट्स द्वारा कार्रवाई की जाती है:

<xsl:template match="num"/> 

और

<xsl:apply-templates mode="copy" select= 
". | following-sibling::*[not(position() >2)]"/> 

है और इस तरह हम चाहते थे परिणाम मिलता है।

यह देखने के लिए कि इन टेम्पलेट्स को कैसे लागू किया जाता है, यह एक अच्छा XSLT डीबगर के साथ कदम उठाने के लिए निर्देशक होगा

+1

अच्छा उदाहरण, चरण-दर-चरण में समझने में आसान, बहुत बहुत धन्यवाद। – Venkat

+0

बढ़िया, मैंने आपका उत्तर पढ़ने से पहले कभी भी मोड को कभी नहीं समझा। इच्छा है कि मैं इसके लिए दो बार मतदान कर सकता हूं। –

+0

वास्तव में एक उत्कृष्ट उदाहरण, बहुत ही समान आवश्यकता मुझे डेटा को प्रति पंक्ति 3 कॉलम के समूह में प्रारूपित करना है। – Shaggy

4

ऑब्जेक्ट-ओरिएंटेड (ओओ) शब्दों में, xsl: लागू-टेम्पलेट्स एक ऐसे फ़ंक्शन की तरह है जो ऑब्जेक्ट्स (नोड्स) की सूची में पुनरावृत्त होता है और प्रत्येक ऑब्जेक्ट के लिए, उसी पॉलीमोर्फिक फ़ंक्शन को कॉल करता है। आपकी स्टाइलशीट में प्रत्येक टेम्पलेट नियम उस एकल पॉलीमोर्फिक फ़ंक्शन के एक अलग कार्यान्वयन को परिभाषित करता है। कौन सा कार्यान्वयन चुना जाता है वस्तु (नोड) की रनटाइम विशेषताओं पर निर्भर करता है। ओओ समरूपता को आगे बढ़ाने, एक मोड नाम यह पहचानता है कि xsl: apply-templates पर कॉल में बार-बार निष्पादित करने के लिए कौन सा पॉलीमोर्फिक फ़ंक्शन निष्पादित करता है। उपयोगी उदाहरण के +1:

<xsl:apply-templates select="phone" /> 
<xsl:apply-templates select="phone" mode="accountNumber"/> 
<xsl:template match="phone"> 
     <TD>A</TD> 
</xsl:template> 
<xsl:template match="phone" mode="accountNumber"> 
     <TD>B</TD> 
</xsl:template> 

लिंक एक सरल उदाहरण यहाँ: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx

+0

यह एक ऐसा उत्तर है जिसे एक्सएसएलटी पॉकेट गाइड से अधिकतर कॉपी और चिपकाया गया जानकारी है। ओपी ने किसी को उदाहरण के साथ इसे समझाने के लिए कहा ... –

+0

एक समारोह के रूप में टेम्पलेट, उदाहरण उदाहरण संक्षेप में ओओ को "फोन" नामक पॉलिमॉर्फिक फ़ंक्शन की तरह प्रदर्शित करता है। आप अलग-अलग फोन को कॉल करने के लिए अलग-अलग मोड दे सकते हैं। –

संबंधित मुद्दे