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/p/2305656.html