XSL: birden fazla şablonla aynı düğümleri etkileyen

Anladığım kadarıyla, normal olarak XSL'de her düğüm sadece bir şablondan etkilenebilir. Bir düğüm bir şablondan etkilendikten sonra, - ve en önemlisi çocukları/soyundan gelenler - başka şablonlardan daha fazla etkilenmez.

Bazen bir dış düğümü bir şablonla etkilemek, sonra alt öğelerini başka bir şablonla etkilemek istersiniz. Aşağıdakiler bunun etrafında tavsiye edilebilir bir yol olabilir mi? Amacı her düğüme 'attr' niteliğini eklemektir.

Source XML: hello!

XSL:

    
        
            
        
    

    
        
            val
            
        
    

    
        
            val
            
        
    


Doğru çizgide miyim?

Şimdiden teşekkürler.

1

2 cevap

Frankly whether a node is processed depends entirely on your templates and the built-in templates (which can be overridden). If a template for a foo element nodes does then the child nodes are processed, if it does then its ancestor elements are processed, just to give two examples. Of course if you write a template for a certain element that does not use apply-templates for further processing then processing stops.

Örneğinize gelince, tüm element düğümlerine bir özellik eklemek istiyorsanız, o zaman ihtiyacınız olan tek şey


  
    
  



  
   
   val
   
  

Bu kimlik dönüşüm şablonu artı yeni öznitelik ekleyerek eleman düğümleri için bir tane.

0
katma
İlk şablon, öznitelik düğümleriyle ( @ * ile) ve öğe düğümleri, yorum düğümleri, işleme talimatı düğümleri, metin düğümleri olan düğüm() ile eşleşen tüm düğüm türleriyle eşleşir veya "düğüm (), bir öznitelik düğümü ve kök düğümü dışındaki tüm düğümlerle eşleşir" şeklindeki bir başka yolla tanımlamak için kullanılır. Yerleşik olarak match = "/" olan bir şablon olması gerekmez. İki şablona olan yaklaşıma gelince, ilki yalnızca düğümleri düğüme, seviye düzeyine göre kopyalar. Seçmeli olarak şablon ekleyerek düğümleri eklemek/kaldırmak/değiştirmek istediğiniz stil sayfaları için başlangıç ​​yaklaşımı görevi görür.
katma yazar Martin Honnen, kaynak
Çok teşekkürler. Birkaç soru: 1) İlk şablon kök ile uyuşmuyor mu? Öyleyse, neden '@ * | node() 'yerine'/'? 2) İkinci şablonda neler olduğunu açıklayabilir misiniz? 3) Orijinal XSL'mde yalnızca bir xsl vardı: copy - bundan sonra düğümler elle yaratıldı ( etc). Her şablonda nasıl bir xsl: copy var? Sabrınız için teşekkürler - XSL’nin HTML yerine xml oluşturma fikri benim için biraz yeni.
katma yazar user736788, kaynak

Anladığım kadarıyla, normal olarak XSL’de her düğüm yalnızca birinden etkilenebilir   şablonu. Bir düğüm bir şablondan etkilendikten sonra,   o - ve en önemlisi, çocukları/soyundan gelenler - etkilenmez   başka herhangi bir şablonla daha ileri düzeyde.

None of these statements are true. Different templates may be selected for execution on the same node -- this all depends on the instructions that result in selecting a particular template for execution. There is a great flexibility in how templates can be applied and selected, such as import precedence, priority, modes, ..., etc.

FXSL'de olduğu gibi, şablonları (düğüm olarak kullanılan) iki düğüme bile yapmak mümkündür.

Bazen, tek bir şablonla bir dış düğümü etkilemek istiyorsanız,   daha sonra başka bir şablonla alt öğelerini/soylarını etkiler. Olur mu   Aşağıdaki bu tavsiye edilebilir bir yol olabilir mi? Amacı eklemek   her düğüm için 'attr' özelliğini kullanın.

This is trivially achieved using the most fundamental XSLT design pattern -- overriding the identity rule:


 
 

 
     
       
     
 

 
  
  
    
      
    
      
  
 

When this transformation is applied on the provided xml document (corrected to be made well-formed):


    
        
            hello! 
        
    

it copies every node and adds a depth attribute to every element. The value of the newly-added attribute is the "depth" of the element:


   
      
         hello! 
      
   

0
katma
Sağol Dimitre. "Anladığım kadarıyla" dedim :) Her zaman öğrenmek.
katma yazar user736788, kaynak