zoukankan      html  css  js  c++  java
  • 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;
                }
            }

     

     

    源代码下载

  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/Erik_Xu/p/2305656.html
Copyright © 2011-2022 走看看