এক্সএসএলে 'কল-টেম্পলেট' এবং 'প্রয়োগ-টেম্পলেট' এর মধ্যে পার্থক্যগুলি কী?


118

আমি এক্সএসএলটি-তে নতুন তাই আমি দুটি ট্যাগ সম্পর্কে কিছুটা বিভ্রান্ত হয়েছি,

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

এবং

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

সুতরাং আপনি তাদের মধ্যে পার্থক্য তালিকাভুক্ত করতে পারেন?

উত্তর:


166

<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>)। এগুলি উন্নত ব্যবহারসমূহ এবং আপনি যখন সেখানে পৌঁছেছেন তখন আপনি সেগুলি মোকাবেলা করতে পারেন।


5
@ তোমালাক: ভাল উত্তর! তবে, বিবৃতিটি: "এক্সএসএল: প্রয়োগ-টেম্পলেটগুলি একটি লুপ" সঠিক নয়। কোনও সরকারী ডাব্লু 3 সি অনুচ্ছেদে কোনও ইঙ্গিত নেই যা <xsl:apply-templates>লুপ হিসাবে প্রয়োগ করা উচিত - বিপরীতে, এটি সমান্তরালভাবে প্রয়োগ করা যেতে পারে, কারণ নোড-তালিকার বিভিন্ন নোডের বিভিন্ন অ্যাপ্লিকেশন একে অপরের থেকে একেবারে স্বতন্ত্র।
দিমিত্রে নোভাচাচেভ

8
@ ডিমিত্রে: আমি যা বলতে চাইছিলাম: শেষ ব্যবহারকারীর দৃষ্টিকোণ থেকে <xsl:apply-templates>লুপের মতো আচরণ করে। এক্সএসএলটি প্রসেসরের শেষের বাস্তবায়নের পার্থক্য আমাকে এক্সএসএলটি প্রোগ্রামার হিসাবে প্রভাবিত করবে না, ফলাফল সমান্তরাল এবং পুনরাবৃত্তিমূলক বাস্তবায়নের জন্য একেবারে একই। তবে একটি অতীব আবশ্যক ব্যাকগ্রাউন্ড সহ এক্সএসএলটি নবজাতকের জন্য, এটি <xsl:apply-templates>প্রতিটি লুপের জন্য এক ধরণের হিসাবে কল্পনা করতে সহায়তা করে - এমনকি প্রযুক্তিগতভাবে - এটি তা নয়।
টমলাক

@ তোমালাক: যদিও এটি নবজাতক এক্সএসএলটি প্রোগ্রামারদের জন্য দরকারী হতে পারে তবে আমি মনে করি এটি প্রায়শই তাদেরকে বিভ্রান্ত করে তোলে কারণ তারা মনে করে যে তারা "লুপটি কার্যকর করার" মধ্যে জমে থাকা রাষ্ট্রীয় তথ্য পুনরায় ব্যবহার করতে পারে।
দিমিত্রে নোভাচাচেভ

@ টমালাক: এই বাস্তবতার কারণে, আমি মনে করি যে "এক্সএসএল: প্রয়োগ-টেমপ্লেটগুলি একটি লুপ" যেমন কিছু থিংকগের মতো: "এক্সএসএল: প্রয়োগ-টেম্পলেটগুলি একটি লুপের মতো "
দিমিত্রে নোভাচেভ

@ তোমালাক: লুপটি পুনরাবৃত্তি, কিছু apply-templatesএবং call-templateনির্দেশাবলীর জন্য নয়। এগুলি এক্সএসএলটিতে পুনরাবৃত্তি প্রক্রিয়া। এবং দিমিত্রে উত্তর হিসাবে, প্রয়োগ-টেমপ্লেটগুলি হল বহুবর্ষ বা ডেটা চালিত প্রক্রিয়া।

15

@ তোমালাক দ্বারা উত্তরের উত্তর যুক্ত করতে:

এখানে কিছু নিরীক্ষিত এবং গুরুত্বপূর্ণ পার্থক্য রয়েছে :

  1. xsl:apply-templatesঅনেক ধনী চেয়ে গভীর হয় xsl:call-templatesএবং এমনকি থেকে xsl:for-each, সাধারণ ক্ষেত্রে এই কোড নোড-তালিকা বিভিন্ন নোডের ভাষার জন্য আলাদা হতে হবে - কারণেই যে, আমরা কি না জানি না কোড নির্বাচনের নোড উপর প্রয়োগ করা হবে।

  2. কোডটি প্রয়োগ করা হবে সেগুলি 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


8

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"/>

... যা আপনার বর্তমান এক্সএমএল নোডের নাম 'নোড' এর সমস্ত শিশুদের জন্য সমস্ত টেম্পলেট প্রয়োগ করে।


2

কার্যকারিতা প্রকৃতপক্ষে অনুরূপ (কলিং শব্দার্থবিজ্ঞান বাদে, যেখানে call-templateএকটি nameবৈশিষ্ট্য এবং সংশ্লিষ্ট নামের টেম্পলেট প্রয়োজন)।

তবে, পার্সার একইভাবে কার্যকর করবে না।

এমএসডিএন থেকে :

বিপরীতে <xsl:apply-templates>, <xsl:call-template>বর্তমান নোড বা বর্তমান নোড-তালিকা পরিবর্তন করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.