Yanıtlar:
<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 mode
ve priority
şablonları a ikisine de sahip olabilir gerçeği, name
ve 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.
<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 tarafından iyi yanıta eklemek için:
Bahsedilmeyen ve önemli farklılıklar şunlardır :
xsl:apply-templates
çok daha zengin ve daha derin xsl:call-templates
ve 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ü.
Uygulanacak kod, xsl:apply template
s 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
xsl:apply-templates
genellikle (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-template
diğ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-template
ben 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.
Ö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.
İşlevsellik gerçekten benzerdir ( call-template
bir 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.
<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.