C# XSLT Transforming Large XML Files Quickly

前端 未结 3 1838
我在风中等你
我在风中等你 2021-01-22 09:32

I\'m transforming a > 2GB file with a lookup template in the XSLT. I would like this to run faster but can\'t find any low hanging fruit to improve performance. Any help would b

3条回答
  •  感情败类
    2021-01-22 10:09

    As an alternative, you might want to look into solving the task with XSLT 3 and its streaming feature (https://www.w3.org/TR/xslt-30/#streaming-concepts) as there you could process the huge input file in a forwards only but declarative way where you only in the template for the attribute element you need to ensure you work with a intentionally created full copy of that element to allow XPath navigation to the child elements. Additionally I think it makese sense to read in the lookup document only once and do the translate calls to create the proper element names only once. So the following is a streaming XSLT 3 solution runnable with Saxon 9.8 EE which transforms the lookup document into an XPath 3.1 map (https://www.w3.org/TR/xpath-31/#id-maps) and otherwise uses a streamable mode to process the large, main input:

    
    
    
        
        
            
                
                    text12
                    ID
                    Varchar2
                    30
                
                
                    text34
                    Last Name
                    Varchar2
                    30
                
                
                    date866
                    DOB
                    Date
                    
                
                  
        
    
        
    
        
    
        
    
        
            
            
                
            
        
    
    
    

    Online sample (there running with Saxon 9.8 HE which ignores the streaming and does normal XSLT processing) is at https://xsltfiddle.liberty-development.net/bFDb2Ct/1.

    To run streaming XSLT 3 with Saxon 9.8 and C# you use http://saxonica.com/html/documentation/dotnetdoc/Saxon/Api/Xslt30Transformer.html and set up ApplyTemplates on an input Stream with your huge input XML (http://saxonica.com/html/documentation/dotnetdoc/Saxon/Api/Xslt30Transformer.html#ApplyTemplates(System.IO.Stream,Saxon.Api.XmlDestination)).

提交回复
热议问题