উত্তর:
<xsl:call-template>
একটি traditionalতিহ্যবাহী প্রোগ্রামিং ভাষায় একটি ফাংশন কল করার কাছাকাছি সমান।
আপনি এক্সএসএলটি-তে ফাংশনগুলি সংজ্ঞায়িত করতে পারেন, যেমন স্ট্রিংকে আউটপুট করে এমন সাধারণের মতো।
<xsl:template name="dosomething">
<xsl:text>A function that does something</xsl:text>
</xsl:template>
এই ফাংশন মাধ্যমে কল করা যেতে পারে <xsl:call-template name="dosomething">
।
<xsl:apply-templates>
কিছুটা আলাদা এবং এটিতে এক্সএসএলটি এর আসল শক্তি: এটি যে কোনও সংখ্যক এক্সএমএল নোড নেয় (আপনি যে 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>
এইভাবে আপনি এক্সএসএলটি প্রসেসরের উপর সামান্য নিয়ন্ত্রণ ছেড়ে দিয়েছেন - আপনি প্রোগ্রামের প্রবাহ কোথায় চলেছেন তা স্থির করেন না, তবে বর্তমানে যে নোডটি এটি প্রক্রিয়াজাত করছে তার সর্বাধিক উপযুক্ত মিল খুঁজে প্রসেসর করে।
যদি একাধিক টেমপ্লেট কোনও নোডের সাথে মেলে, তবে আরও নির্দিষ্ট ম্যাচের অভিব্যক্তিটি জয়ী হয়। যদি একই স্পেসিফিকেশনের সাথে একাধিক মেলানো টেম্পলেট বিদ্যমান থাকে তবে একটি সর্বশেষ জয়ের ঘোষণা করে।
আপনি টেমপ্লেটগুলি বিকাশে আরও মনোনিবেশ করতে পারেন এবং "নদীর গভীরতানির্ণয়" করার জন্য কম সময় প্রয়োজন। আপনার প্রোগ্রামগুলি আরও শক্তিশালী এবং মডুলারাইজড হয়ে উঠবে, কম গভীরভাবে নেস্টেড এবং দ্রুত হবে (এক্সএসএলটি প্রসেসরগুলি টেমপ্লেটের সাথে মিলে যাওয়ার জন্য অনুকূলিত হয়েছে)।
এক্সএসএলটি দিয়ে বুঝতে একটি ধারণাটি হ'ল "বর্তমান নোড"। সঙ্গে <xsl:apply-templates>
প্রতি পুনরাবৃত্তির সঙ্গে বর্তমান নোড প্যাচসমূহ, যেহেতু <xsl:call-template>
বর্তমান নোড পরিবর্তন করে না। অর্থাত্ .
একটি .
কল টেম্পলেটটির মধ্যে থাকা কলিং টেম্পলেটটিতে একই নোডকে বোঝায় । এটি প্রয়োগ-টেম্পলেটগুলির ক্ষেত্রে নয়।
এটিই মূল পার্থক্য। টেমপ্লেটের আরও কিছু বিষয় রয়েছে যা তাদের আচরণকে প্রভাবিত করে: তাদের mode
এবং priority
, এই টেমপ্লেটগুলির একটি name
এবং a উভয়ই থাকতে পারে match
। এটির প্রভাবও রয়েছে টেমপ্লেটটি আমদানি করা হয়েছে কিনা ( <xsl:import>
)। এগুলি উন্নত ব্যবহারসমূহ এবং আপনি যখন সেখানে পৌঁছেছেন তখন আপনি সেগুলি মোকাবেলা করতে পারেন।
<xsl:apply-templates>
লুপের মতো আচরণ করে। এক্সএসএলটি প্রসেসরের শেষের বাস্তবায়নের পার্থক্য আমাকে এক্সএসএলটি প্রোগ্রামার হিসাবে প্রভাবিত করবে না, ফলাফল সমান্তরাল এবং পুনরাবৃত্তিমূলক বাস্তবায়নের জন্য একেবারে একই। তবে একটি অতীব আবশ্যক ব্যাকগ্রাউন্ড সহ এক্সএসএলটি নবজাতকের জন্য, এটি <xsl:apply-templates>
প্রতিটি লুপের জন্য এক ধরণের হিসাবে কল্পনা করতে সহায়তা করে - এমনকি প্রযুক্তিগতভাবে - এটি তা নয়।
@ তোমালাক দ্বারা উত্তরের উত্তর যুক্ত করতে:
এখানে কিছু নিরীক্ষিত এবং গুরুত্বপূর্ণ পার্থক্য রয়েছে :
xsl:apply-templates
অনেক ধনী চেয়ে গভীর হয় xsl:call-templates
এবং এমনকি থেকে xsl:for-each
, সাধারণ ক্ষেত্রে এই কোড নোড-তালিকা বিভিন্ন নোডের ভাষার জন্য আলাদা হতে হবে - কারণেই যে, আমরা কি না জানি না কোড নির্বাচনের নোড উপর প্রয়োগ করা হবে।
কোডটি প্রয়োগ করা হবে সেগুলি xsl:apply template
গুলি লেখার পরে এবং মূল লেখককে চেনে না এমন লোকদের দ্বারা লেখা যেতে পারে ।
FXSL গ্রন্থাগার এর XSLT উচ্চতর-অর্ডার ফাংশন (HOF) বাস্তবায়ন সম্ভব হবে না যদি XSLT ছিল না <xsl:apply-templates>
নির্দেশ।
সংক্ষিপ্তসার : টেমপ্লেট এবং <xsl:apply-templates>
নির্দেশনাটি কীভাবে এক্সএসএলটি পলিমারফিজম প্রয়োগ করে এবং ডিল করে।
তথ্যসূত্র : পুরো থ্রেডটি দেখুন: http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/msg00546.html
xsl:apply-templates
সমস্ত প্রযোজ্য টেম্পলেটগুলির সাথে বর্তমান নোডের বাচ্চাদের সমস্ত বা উপসেটটি প্রক্রিয়া করার জন্য সাধারণত (তবে অগত্যা প্রয়োজনীয় নয়) ব্যবহৃত হয় । এটি এক্সএসএলটি অ্যাপ্লিকেশনটির পুনরাবৃত্তিকে সমর্থন করে যা প্রক্রিয়াজাত এক্সএমএলের (সম্ভাব্য) পুনরাবৃত্তির সাথে মেলে।
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"/>
... যা আপনার বর্তমান এক্সএমএল নোডের নাম 'নোড' এর সমস্ত শিশুদের জন্য সমস্ত টেম্পলেট প্রয়োগ করে।
কার্যকারিতা প্রকৃতপক্ষে অনুরূপ (কলিং শব্দার্থবিজ্ঞান বাদে, যেখানে call-template
একটি name
বৈশিষ্ট্য এবং সংশ্লিষ্ট নামের টেম্পলেট প্রয়োজন)।
তবে, পার্সার একইভাবে কার্যকর করবে না।
এমএসডিএন থেকে :
বিপরীতে
<xsl:apply-templates>
,<xsl:call-template>
বর্তমান নোড বা বর্তমান নোড-তালিকা পরিবর্তন করে না।
<xsl:apply-templates>
লুপ হিসাবে প্রয়োগ করা উচিত - বিপরীতে, এটি সমান্তরালভাবে প্রয়োগ করা যেতে পারে, কারণ নোড-তালিকার বিভিন্ন নোডের বিভিন্ন অ্যাপ্লিকেশন একে অপরের থেকে একেবারে স্বতন্ত্র।