XSLT to Merge 2 XML Files

后端 未结 2 1693
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-28 04:26

I know there are few xml/xslt merge related questions here however none seems to solve the problem I have.

What I am looking is an XSLT (as generic as possible - not tig

2条回答
  •  暖寄归人
    2021-01-28 04:56

    The following XSLT 1.0 program does what you want.

    Apply it to b.xml and pass in the path to a.xml as a parameter.

    Here is how it works.

    1. It traverses B, as that contains the new nodes that you want to keep as well as the common elements between A and B.
      1. I define "common element" as any element that has the same simple path.
      2. I define "simple path" as the slash-delimited list of names of ancestor elements and the element itself, i.e. the ancestor-or-self axis.
        So in your sample B, would have a simple path of root_node/settings/setting3/setting31/.
      3. Note that this path is ambiguous. The implication is that you cannot have any two elements with the same name that share the same parent in your input. Based on your samples I presume that will not be the case.
    2. For every leaf text node (any text node in an element with no further child elements)
      1. The simple path is calculated with a template called calculatePath.
      2. The recursive template nodeValueByPath is called that tries to retrieve the text value of the corresponding simple path from the other document.
      3. If a corresponding text node is found, its value is used. This satisfies your first bullet point.
      4. If no corresponding node is found, it uses the value at hand, i.e. the value from B. This satisfies your second bullet point.

    As a result, the new document matches B's structure and contains:

    • all text node values from B that have no corresponding node in A.
    • text node values from A when a corresponding node in B exists.

    Here's the XSLT:

    
      
    
      
      
    
      
        
           
        
      
    
      
      
        
          
        
    
        
          
            
            
          
        
    
        
          
          
             
            
          
          
          
            
          
        
      
    
      
      
        
          
        
        
          
        
      
    
      
      
        
        
    
        
          
          
          
    
          
            
              
                
                  
                  
                
              
              
                
                
              
            
          
            
      
    
    

提交回复
热议问题