XSL:複数のテンプレートを持つ同じノードに影響する

私が理解しているように、通常はXSLでは各ノードが1つのテンプレートの影響を受けるだけです。あるノードがテンプレートの影響を受けると、そのノード、そしてその子/子孫が他のテンプレートによって影響を受けることはありません。

ただし、外部ノードに1つのテンプレートで影響を与え、その後、別のテンプレートでその子/子孫に影響を与えたい場合もあります。これは、次のことがお勧めですか?その目的は、属性 'attr'を各ノードに追加することです。

Source XML: hello!

XSL:

    
        
            
        
    

    
        
            val
            
        
    

    
        
            val
            
        
    


私は正しい行にいますか?

前もって感謝します。

1

2 答え

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.

あなたのサンプルについては、すべての要素ノードに属性を追加する場合は、必要なのは


  
    
  



  
   
   val
   
  

これはアイデンティティ変換テンプレートと、新しい属性を追加する要素ノード用のテンプレートです。

0
追加された
最初のテンプレートは要素ノード、コメントノード、処理命令ノード、テキストノードである node()によって一致する属性ノード( @ * (node)が属性ノードとルートノード以外の任意のノードにマッチしていることを意味します)。 match = "/" のようにテンプレートが組み込まれている必要はありません。 2つのテンプレートを使用するアプローチでは、最初のノードだけでノードをレベルごとにノードごとにコピーします。これは、テンプレートを追加してノードを追加/削除/変更することを選択したいスタイルシートの出発点となります。
追加された 著者 Martin Honnen,
どうもありがとう。いくつかの質問:1)最初のテンプレートはルートと一致しませんか?もしそうなら、なぜ '@ * | node() 'ではなく'/'ですか? 2)2番目のテンプレートで何が起こっているのか説明できますか? 3)オリジナルのXSLにはxsl:copyが1つしかありません。その後、ノードは手動で作成されました(など)。あなたはどのように各テンプレートにxsl:コピーを持っていますか?忍耐力をありがとう - HTMLではなくXMLを作成するという考えは、私には少し新しくなっています。
追加された 著者 user736788,

私が理解しているように、通常はXSLでは各ノードが   テンプレート。ノードがテンプレートの影響を受けると、   それ - そして、その子供たち/子孫 - は影響を受けません   さらに他のテンプレートでも使用できます。

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のように、テンプレートをノード(ノードとして使用)にデュアル化することも可能です。

場合によっては、1つのテンプレートで外部ノードに影響を与えたい場合もありますが、   その子/子孫に別のテンプレートを適用します。あなたは   次のことをお勧めする方法は?その目的は   属性 'attr'を各ノードに追加します。

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
追加された
ありがとう、Dimitre。私は "私がそれを理解する"と言っていました:)常に勉強しています。
追加された 著者 user736788,