2011-06-12 15 views
5

apply-templates'u anlamaya çalışıyorum ama neden apply-templates numaralı belgede herhangi bir select = "nodename" yazmamayı anlamıyorum: (ilk uygulamayı düşünüyorum. Benim CD koleksiyonu altındaki şablonları) giriş belgesindenNeden ilk uygulama şablonlarında seçim yok

Pasajı:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
    <cd> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
     <country>USA</country> 
     <company>RCA</company> 
     <price>9.90</price> 
     <year>1982</year> 
    </cd> 

XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd"> 
    <p> 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

<xsl:template match="artist"> 
    Artist: <span style="color:#00ff00"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

</xsl:stylesheet> 

w3schools eğitiminden alınmıştır. Hangi şablonların seçmesi gerektiğini nasıl anlar? özellikleri ile olduğu gibi

+0

Cevabınızı düzenleyebilir giriş belgesini ekleyerek? –

+0

@empo: Evet, teşekkürler. – LuckyLuke

+0

** TL; DR: ** "apply-templates", ağacın tüm düğümlerine uygulanan (uygulanmadıkça) dahili bir özyineleme işlemidir. " – Andrew

cevap

6

: select özniteliğinin yokluğunda

xsl: apply-templates yönergesi metin düğümleri de dahil olmak akım düğümün tüm çocuklarını, işler. (Eğer title ve artist için yaptığı gibi) XPath seçim olmadan

apply-templates

, açıkça şablonları tahrik sürece, derleme sırasında işlemci tarafından inşa XML ağaç görünümünde hiyerarşisi aşağıdaki şablonları uygular.

Ayrıca nasıl built-in template rules işin düşünmek isteyebilirsiniz. Bu kurallar sahnelerin arkasında çalışır ve başarılı bir desen eşleşmesinin yokluğunda yinelemeli sürece devam eder.

Yani root için şablon maçı atlarsanız / Şablonlarınız, zaten yerleşik kurallara sayesinde yürütülür alacak.

  • şablon kökü ile eşleşir ve xsl:apply-templates (o çağrılır nereye yerinde) catalog elemana şablonları uygulamak için işlemciyi söyler:

    ben işleme sırası böyle olması gerektiğini düşünüyorum. Yerleşik kural başarılı desen maçı ile yeni bir şablona kadar diğer soyundan elemanları (catalog) doğru işleme devam verir, böylece

  • Eşleşen şablonları (cd)

inşa bulunursa, catalog için bulunurlar -in kural perde arkasında çalışan ve şablonlarınızdan tarafından bestelenen olarak kendi dönüşüm her zaman düşünmek, artı birkaç gizli ek (ancak çalışma) şablonlar gerekir: üç arasında eski şablon üzerindeydi özel durumda

<xsl:template match="*|/"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="processing-instruction()|comment()"/> 

Şablonları cd öğelerine uygulamaktan sorumlu olanı.

Bu yerleşik şablonları açık bir şablonu yazmak her zaman geçersiz olur.


Örnekler

Sen değiştirerek aynı edinebilirsiniz:

<xsl:template match="cd"> 
    <p> 
     <xsl:apply-templates select="title"/> 
     <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

ile: root Hakkında

<xsl:template match="country|company|price|year"/> 

<xsl:template match="cd"> 
    <p> 
     <xsl:apply-templates /> 
    </p> 
</xsl:template> 

, içinde senin durum, aynı zamanda değiştirerek aynı elde edebilir:

<xsl:template match="/"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <xsl:apply-templates/> 
     </body> 
    </html> 
</xsl:template> 

hala

<xsl:template match="/catalog"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <xsl:apply-templates/> 
     </body> 
    </html> 
</xsl:template> 

veya

ile: hala

<xsl:template match="/"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <xsl:apply-templates select="catalog"/> 
     </body> 
    </html> 
</xsl:template> 

ya:

<xsl:template match="catalog"> 
    <html> 
     <body> 
      <h2>My CD Collection</h2> 
      <xsl:apply-templates /> 
     </body> 
    </html> 
</xsl:template> 
+0

@empo: Teşekkür ederim, ama '/' kataloğa eşittir ve belge kökünü değil? Eğer eleman kökünü istediysem “/ catalog” yazmam gerektiğini düşündüm ama bu bölüm “normal” xpath'dan farklı mı? Birbirleri ile kafamı karıştırabilirim ... – LuckyLuke

+0

@Andreas: no, '/' belge kataloğu değil, katalogdur. Senin durumunda çok fazla farketmez. Cevabımı gör. –

+0

@empo: Üzgünüm, ama henüz tam olarak anlamadım. İlk olarak '/' ile eşleşen bir şablon yazarım? Bu belge köküdür. Daha sonra, geçerli olanın tüm çocuk düğümlerini işleyen bir seçim olmadan şablonlar yazarım, '/' değil mi? CD'leri nasıl yapabileceğini anlamıyorum. – LuckyLuke

İlgili konular