xslt调用自定义函数(C#/Js/Java)

本文主要演示xslt调用自定义的函数,此处用C#作为编写自定义函数的语言,用C#去完成xsltxml的筛选功能。

 

CSharpFunctions.xslt
<? xml version="1.0" encoding="UTF-8"  ?>
< xsl:stylesheet  version ="1.0"  xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl ="urn:schemas-microsoft-com:xslt"  xmlns:csfun ="urn:csharp-functions"  exclude-result-prefixes ="msxsl" >
     < msxsl:script  implements-prefix ="csfun"  language ="C#" >
         <![CDATA[         
        public bool CheckDate(string target)
        {
            DateTime dtTarget;

            if (DateTime.TryParse(target, out dtTarget))
            {
                DateTime dtMinDate = new DateTime(1900, 1, 1);
                DateTime dtMaxDate = new DateTime(2079, 6, 1);

                if ((dtTarget - dtMinDate).Days > 0 && (dtTarget - dtMaxDate).Days < 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckInt(string target)
        {
            int tmpInt;

            if (int.TryParse(target, out tmpInt))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckLong(string target)
        {
            long tmpLong;

            if (long.TryParse(target, out tmpLong))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckDouble(string target)
        {
            double tmpDouble;

            if (double.TryParse(target, out tmpDouble))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckDecimal(string target)
        {
            decimal tmpDecimal;

            if (decimal.TryParse(target, out tmpDecimal))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public string Trim(string target)
        {
            if (target == null)
            {
                return null;
            }
            else 
            {
                return target.Trim();
            }
        }
        
        public string TrimSymbol(string target, string symbol)
        {
            if (target == null || symbol == null)
            {
                return null;
            }
            else 
            {
                return target.Replace(symbol, string.Empty);
            }
        }
        
]]>
     </ msxsl:script >
</ xsl:stylesheet >
<? xml version="1.0" encoding="UTF-8"  ?>

< xsl:stylesheet  version ="1.0"  xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl ="urn:schemas-microsoft-com:xslt"  xmlns:csfun ="urn:csharp-functions"  exclude-result-prefixes ="msxsl" >

      < msxsl:script  implements-prefix ="csfun"  language ="C#" >

          <![CDATA[        

        public bool CheckDate(string target)

        {

            DateTime dtTarget;

 

            if (DateTime.TryParse(target, out dtTarget))

            {

                DateTime dtMinDate = new DateTime(1900, 1, 1);

                DateTime dtMaxDate = new DateTime(2079, 6, 1);

 

                if ((dtTarget - dtMinDate).Days > 0 && (dtTarget - dtMaxDate).Days < 0)

                {

                    return true;

                }

                else

                {

                    return false;

                }

            }

            else

            {

                return false;

            }

        }

        

        public bool CheckInt(string target)

        {

            int tmpInt;

 

            if (int.TryParse(target, out tmpInt))

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        

        public bool CheckLong(string target)

        {

            long tmpLong;

 

            if (long.TryParse(target, out tmpLong))

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        

        public bool CheckDouble(string target)

        {

            double tmpDouble;

 

            if (double.TryParse(target, out tmpDouble))

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        

        public bool CheckDecimal(string target)

        {

            decimal tmpDecimal;

 

            if (decimal.TryParse(target, out tmpDecimal))

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        

         public string Trim(string target)

         {

              if (target == null)

              {

                   return null;

              }

              else

              {

                   return target.Trim();

              }

         }

        

         public string TrimSymbol(string target, string symbol)

         {

              if (target == null || symbol == null)

              {

                   return null;

              }

              else

              {

                   return target.Replace(symbol, string.Empty);

              }

         }

         
]]>

      </ msxsl:script >

</ xsl:stylesheet >

包含C#自定义函数的xslt文件:

CSharpFunctions.xslt
<? xml version="1.0" encoding="UTF-8"  ?>
< xsl:stylesheet  version ="1.0"  xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl ="urn:schemas-microsoft-com:xslt"  xmlns:csfun ="urn:csharp-functions"  exclude-result-prefixes ="msxsl" >
     < msxsl:script  implements-prefix ="csfun"  language ="C#" >
         <![CDATA[         
        public bool CheckDate(string target)
        {
            DateTime dtTarget;

            if (DateTime.TryParse(target, out dtTarget))
            {
                DateTime dtMinDate = new DateTime(1900, 1, 1);
                DateTime dtMaxDate = new DateTime(2079, 6, 1);

                if ((dtTarget - dtMinDate).Days > 0 && (dtTarget - dtMaxDate).Days < 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckInt(string target)
        {
            int tmpInt;

            if (int.TryParse(target, out tmpInt))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckLong(string target)
        {
            long tmpLong;

            if (long.TryParse(target, out tmpLong))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckDouble(string target)
        {
            double tmpDouble;

            if (double.TryParse(target, out tmpDouble))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public bool CheckDecimal(string target)
        {
            decimal tmpDecimal;

            if (decimal.TryParse(target, out tmpDecimal))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        public string Trim(string target)
        {
            if (target == null)
            {
                return null;
            }
            else 
            {
                return target.Trim();
            }
        }
        
        public string TrimSymbol(string target, string symbol)
        {
            if (target == null || symbol == null)
            {
                return null;
            }
            else 
            {
                return target.Replace(symbol, string.Empty);
            }
        }
        
]]>
     </ msxsl:script >
</ xsl:stylesheet >

 

 

调用C#自定义函数的xslt文件:

CSRCNAV.xslt
<? xml version="1.0" encoding="UTF-8"  ?>
< xsl:stylesheet  version ="1.0"  xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl ="urn:schemas-microsoft-com:xslt"  xmlns:csfun ="urn:csharp-functions"  exclude-result-prefixes ="msxsl" >
     < xsl:output  method ="xml"  indent ="yes" />
     < xsl:include  href ="CSharpFunctions.xslt" />
     < xsl:template  match ="/" >
         < CSRCNAVSet >
             < xsl:for-each  select ="//table[@id='tablesorter-instance']/tbody/tr" >
                 < CSRCNAV >
                     < Symbol >
                         < xsl:value-of  select ="td[position()=2]" />
                     </ Symbol >
                     < Name >
                         < xsl:value-of  select ="csfun:Trim(td[position()=3])" />
                     </ Name >
                     < xsl:if  test ="csfun:CheckDecimal(td[position()=4])" >
                         < ClosePrice >
                             < xsl:value-of  select ="td[position()=4]" />
                         </ ClosePrice >
                     </ xsl:if >
                     < EffectiveDate >
                         < xsl:value-of  select ="td[position()=6]" />
                     </ EffectiveDate >
                 </ CSRCNAV >
             </ xsl:for-each >
         </ CSRCNAVSet >
     </ xsl:template >
</ xsl:stylesheet >

 

调用目标xml文件:

target.xml
<? xml version="1.0" encoding="utf-8" ?>
<!-- 此处主要显示文件的结构,完整的内容请查看源代码中的文件 -->
< Root >
     < table  id ="tablesorter-instance"  class ="tablesorter"  width ="100%"  border ="0"  cellpadding ="0"  cellspacing ="1" >
         < thead >
             < tr >
                 < th >序号 </ th >
                 < th >基金代码 </ th >
                 < th >基金简称 </ th >
                 < th >
                    当日净值
                 </ th >
                 < th >
                    累计净值
                 </ th >
                 < th >估值日期  </ th >
             </ tr >
         </ thead >
         < tbody >
             < tr >
                 < td  align ="center" >1 </ td >
                 < td  align ="center" >688888 </ td >
                 < td  align ="center" >
                     < href ="/web/fund_detail.fund?fundId=808080802fdcf1fc012ffd2ffba96c01&amp;classification=2030-1030"  target ="_blank" >
                        浙商聚潮产业成长股票
                     </ a >
                 </ td >
                 < td  align ="center" >0.840 </ td >
                 < td  align ="center" >0.840 </ td >
                 < td  align ="center" >2012-01-12 </ td >
             </ tr >
             < tr >
                 < td  align ="center" >2 </ td >
                 < td  align ="center" >710001 </ td >
                 < td  align ="center" >
                     < href ="/web/fund_detail.fund?fundId=80808080317379bd01328b3fc41e73eb&amp;classification=2030-1030"  target ="_blank" >
                        富安达优势成长股票
                     </ a >
                 </ td >
                 < td  align ="center" >0.9561 </ td >
                 < td  align ="center" >0.9561 </ td >
                 < td  align ="center" >2012-01-12 </ td >
             </ tr >
             < tr >
                 < td  align ="center" >3 </ td >
                 < td  align ="center" >162006 </ td >
                 < td  align ="center" >
                     < href ="/web/fund_detail.fund?fundId=4028928d1ab44ebf011ab44ec4a400b7&amp;classification=2030-1030"  target ="_blank" >
                        长城久富股票(LOF)
                     </ a >
                 </ td >
                 < td  align ="center" >0.9407 </ td >
                 < td  align ="center" >3.3315 </ td >
                 < td  align ="center" >2012-01-12 </ td >
             </ tr >
         </ tbody >
     </ table >
</ Root >

 

C#代码:

1)  导出一个Format后的文件output.xml

View Code
  ///   <summary>
        
///  输出Format后的xml文件output.xml
        
///   </summary>
         private  static  void OutputFormatXML()
        {
             string xmlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,  " target.xml ");
             string xsltPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,  " CSRCNAV.xslt ");
             string outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,  " output.xml ");

            XmlDocument xmlDoc =  new XmlDocument();
            xmlDoc.Load(xmlPath);

            StringBuilder sbXml =  new StringBuilder();
            StringWriter stringWriter =  new StringWriter(sbXml);
            XmlTextWriter xmlTextWriter =  new XmlTextWriter(stringWriter);

             // 设置可以执行脚本函数
            XsltSettings settings =  new XsltSettings();
            settings.EnableDocumentFunction =  true;
            settings.EnableScript =  true;

             // 设置xslt可以包含外部的xslt文件
            XmlUrlResolver resolver =  new XmlUrlResolver();
            resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;

            XslCompiledTransform xslCompiledTransform =  new XslCompiledTransform();
            xslCompiledTransform.Load(xsltPath, settings, resolver);
            xslCompiledTransform.Transform(xmlDoc, xmlTextWriter);

            XmlDocument xmlFormatDoc =  new XmlDocument();
            xmlFormatDoc.LoadXml(sbXml.ToString());
            xmlFormatDoc.Save(outputPath);
        }

 

2)  再加上一个schema文件还可以构造成想要的DataTable

Schema文件:

CSRCNAV.xsd
<? xml version="1.0" encoding="utf-8" ?>
< xs:schema  id ="CSRCNAVSet"  xmlns =""  xmlns:xs ="http://www.w3.org/2001/XMLSchema"  xmlns:msdata ="urn:schemas-microsoft-com:xml-msdata" >
     < xs:element  name ="CSRCNAVSet"  msdata:MainDataTable ="CSRCNAV"  msdata:UseCurrentLocale ="true" >
         < xs:complexType >
             < xs:choice  minOccurs ="0"  maxOccurs ="unbounded" >
                 < xs:element  name ="CSRCNAV" >
                     < xs:complexType >
                         < xs:sequence >
                             < xs:element  name ="Symbol"  type ="xs:string"  minOccurs ="0"   />
                             < xs:element  name ="ClosePrice"  type ="xs:decimal"  minOccurs ="0"   />
                             < xs:element  name ="BidPrice"  type ="xs:decimal"  minOccurs ="0"   />
                             < xs:element  name ="OfferPrice"  type ="xs:decimal"  minOccurs ="0"   />
                             < xs:element  name ="EffectiveDate"  type ="xs:dateTime"  minOccurs ="0"   />
                             < xs:element  name ="DataSource"  type ="xs:string"  default ="csrc"   />
                         </ xs:sequence >
                     </ xs:complexType >
                 </ xs:element >
             </ xs:choice >
         </ xs:complexType >
     </ xs:element >
</ xs:schema >

 

C#代码:

View Code
         private  static DataTable OutputDataTable()
        {
             string xmlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,  " target.xml ");
             string xsltPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,  " CSRCNAV.xslt ");
             string schemaPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,  " CSRCNAV.xsd ");

            XmlDocument xmlDoc =  new XmlDocument();
            xmlDoc.Load(xmlPath);

             // 设置可以执行脚本函数
            XsltSettings settings =  new XsltSettings();
            settings.EnableDocumentFunction =  true;
            settings.EnableScript =  true;

             // 设置xslt可以包含外部的xslt文件
            XmlUrlResolver resolver =  new XmlUrlResolver();
            resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;

            MemoryStream memoryStream =  new MemoryStream();
            XslCompiledTransform xslCompiledTransform =  new XslCompiledTransform();
            xslCompiledTransform.Load(xsltPath, settings, resolver);
            xslCompiledTransform.Transform(xmlDoc,  null, memoryStream);

             using (DataTable dt =  new DataTable())
            {
                dt.ReadXmlSchema(schemaPath);
                memoryStream.Position =  0;
                dt.ReadXml(memoryStream);

                 return dt;
            }
        }

 

 

源代码下载

转载于:https://www.cnblogs.com/Erik_Xu/archive/2012/01/17/2305656.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值