XSL'de 'çağrı şablonu' ve 'şablon uygulama' arasındaki farklar nelerdir?


119

XSLT'de yeniyim, bu yüzden iki etiket konusunda biraz kafam karıştı.

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

ve

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

Öyleyse aralarındaki farkı listeleyebilir misiniz?

Yanıtlar:


167

<xsl:call-template> geleneksel bir programlama dilinde bir işlevi çağırmaya yakın bir eşdeğerdir.

XSLT'de bir dizge çıkaran bu basit işlev gibi işlevler tanımlayabilirsiniz.

<xsl:template name="dosomething">
  <xsl:text>A function that does something</xsl:text>
</xsl:template>

Bu işlev, aracılığıyla çağrılabilir <xsl:call-template name="dosomething">.

<xsl:apply-templates>biraz farklıdır ve içinde XSLT'nin gerçek gücü vardır: Herhangi bir sayıda XML düğümünü alır ( selectöznitelikte tanımladığınız ne olursa olsun ), onları yineler ( bu önemlidir: uygulama şablonları bir döngü gibi çalışır! ) ve eşleşen şablonları bulur onlar için:

<!-- 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>

Bu şekilde XSLT işlemcisine biraz denetimden vazgeçersiniz - program akışının nereye gideceğine siz karar vermezsiniz, ancak işlemci şu anda işlediği düğüm için en uygun eşleşmeyi bularak yapar.

Birden çok şablon bir düğümle eşleşebiliyorsa, daha özel eşleşme ifadesine sahip olan kazanır. Aynı spesifikliğe sahip birden fazla eşleşen şablon varsa, en son bildirilen kazanır.

Şablon geliştirmeye daha fazla konsantre olabilir ve "tesisatçılık" yapmak için daha az zamana ihtiyaç duyabilirsiniz. Programlarınız daha güçlü ve modüler hale gelecek, daha az iç içe geçecek ve daha hızlı hale gelecektir (XSLT işlemcileri şablon eşleştirme için optimize edildiğinden).

XSLT ile anlaşılması gereken bir kavram, "mevcut düğüm" kavramıdır. İle <xsl:apply-templates>her yineleme ile ilgili güncel düğüm hamle, oysa <xsl:call-template>şimdiki düğümü değiştirmez. Yani, .çağrılan şablonun .içindeki, çağıran şablondaki ile aynı düğümü ifade eder . Uygulama şablonlarında durum böyle değildir.

Bu temel farktır. Onların: Orada onların davranışını etkileyen şablonları diğer bazı yönleri modeve priorityşablonları a ikisine de sahip olabilir gerçeği, nameve match. Ayrıca şablonun içe aktarılıp ( <xsl:import>) aktarılıp aktarılmayacağı da etkiye sahiptir . Bunlar gelişmiş kullanımlardır ve oraya vardığınızda bunlarla başa çıkabilirsiniz.


5
@Tomalak: Güzel cevap! Ancak, "xsl: apply-templates bir döngüdür" ifadesi doğru değildir. Herhangi bir resmi W3C spec hiçbir gösterge yoktur <xsl:apply-templates>tersine, - bir döngü olarak uygulanması gerekir olabilir düğüm listesi farklı düğümlerin farklı uygulamalar birbirinden tamamen bağımsız olarak, çünkü paralel olarak uygulanacaktır.
Dimitre Novatchev

8
@Dimitre: Söylemek istediğim: Bir son kullanıcının bakış açısından, <xsl:apply-templates>bir döngü gibi davranır. XSLT işlemcisinin ucundaki uygulama farklılıkları, bir XSLT programcısı olarak beni etkilemeyecek, sonuç hem paralelleştirilmiş hem de yinelemeli uygulamalar için kesinlikle aynı. Ancak zorunlu bir geçmişe sahip bir XSLT acemi <xsl:apply-templates>için, teknik olarak öyle olmasa bile, her döngü için bir çeşit tasavvur etmek yardımcı olur .
Tomalak

@Tomalak: Bu, acemi XSLT programcıları için yararlı olsa da, "döngünün yürütülmesinde" biriken durum bilgisini yeniden kullanabileceklerini düşündükleri için genellikle yanıltıcı olduğunu düşünüyorum.
Dimitre Novatchev

@Tomalak: Bu gerçeklerden dolayı, "xsl: apply-templates bir döngüdür" gibi bir
düşünce ile

@Tomalak: Döngü yinelemedir, bir şey apply-templatesve call-templatetalimatlar için değildir. XSLT'deki özyineleme mekanizmasıdır. Dimitre'nin yanıtladığı gibi, uygulama-şablonları çok biçimlilik veya veri odaklı bir mekanizmadır.

15

@Tomalak tarafından iyi yanıta eklemek için:

Bahsedilmeyen ve önemli farklılıklar şunlardır :

  1. xsl:apply-templatesçok daha zengin ve daha derin xsl:call-templatesve hatta gelen xsl:for-each, genel durumda bu kod düğüm-listesinin farklı düğümler için farklı olacaktır - biz seçimi düğümler uygulanacak hangi kod bilmiyorum çünkü.

  2. Uygulanacak kod, xsl:apply templates yazıldıktan sonra ve asıl yazarı tanımayan kişiler tarafından yazılabilir .

FXSL kütüphanesi 'ın XSLT'de yüksek mertebeden fonksiyonlar (HOF) uygulanması mümkün olmazdı XSLT olmasaydı <xsl:apply-templates>talimatı.

Özet : Şablonlar ve <xsl:apply-templates>talimat, XSLT'nin polimorfizmi nasıl uyguladığı ve ele aldığıdır.

Referans : Bu konunun tamamına bakın: http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/msg00546.html


8

xsl:apply-templatesgenellikle (zorunlu olmamakla birlikte) geçerli düğümün tüm alt kümelerini veya alt kümelerini tüm uygulanabilir şablonlarla işlemek için kullanılır . Bu, işlenen XML'in (olası) özyinelemeliğiyle eşleşen XSLT uygulamasının özyinelemesini destekler.

xsl:call-templatediğer yandan normal bir işlev çağrısı gibi. Genellikle bir veya daha fazla parametre ile tam olarak bir (adlandırılmış) şablon çalıştırırsınız.

Bu nedenle xsl:apply-templates, ilginç bir düğümün işlenmesini engellemek ve (genellikle) çıktı akışına bir şey enjekte etmek istersem kullanırım . Tipik (basitleştirilmiş) bir örnek şöyle olacaktır:

<xsl:template match="foo">
  <bar>
    <xsl:apply-templates/>
  </bar>
</xsl:template>

oysa xsl:call-templateben tipik olarak bazı alt düğümlerin metnini bir araya getirmek, belirli düğüm kümelerini metne veya diğer düğüm kümelerine dönüştürmek gibi sorunları çözerim - özel, yeniden kullanılabilir bir işlev yazabileceğiniz herhangi bir şey.

Düzenle:

Özel soru metninize ek bir açıklama olarak:

<xsl:call-template name="nodes"/> 

Bu, 'düğümler' adlı bir şablonu çağırır:

    <xsl:template name="nodes">...</xsl:template>

Bu şunlardan farklı bir anlambilimdir:

<xsl:apply-templates select="nodes"/>

... tüm şablonları, adı 'düğümler' olan geçerli XML düğümünüzün tüm alt öğelerine uygular.


2

İşlevsellik gerçekten benzerdir ( call-templatebir nameöznitelik ve karşılık gelen bir ad şablonu gerektiren çağıran anlambilim dışında ).

Ancak ayrıştırıcı aynı şekilde çalışmayacaktır.

Gönderen MSDN :

Aksine <xsl:apply-templates>, <xsl:call-template>geçerli düğümü veya geçerli düğüm listesini değiştirmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.