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

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">
                    <a 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">
                    <a 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">
                    <a 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

xslt调用自定义函数(C#/Js/Java)相关推荐

  1. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  2. python函数文档说明调用方式_Python 跨.py文件调用自定义函数说明

    0 前言 os.chdir() :用于改变当前python工作的目录到指定的路径 sys.path:是python搜索模块的一个路径集,为list,自定义的包可以把存放路径加进去,之后直接调用包名就行 ...

  3. PHP中call user func()和call_user_func_array()调用自定义函数小结

    call_user_func() 和 call_user_func_array(),通过传入字符串函数,可以调用自定义函数,并且支持引用,都允许用户调用自定义函数并传入一定的参数: 1.mixed c ...

  4. python 方法的实例_python调用自定义函数的实例操作

    在python中,想要调用自定义函数必须先声明,然后才能调用.使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果. (1)声明函数 pyt ...

  5. python调用自己写的函数_python调用自定义函数的实例操作

    在python中,想要调用自定义函数必须先声明,然后才能调用.使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果. (1)声明函数 pyt ...

  6. C语言:自定义函数中调用自定义函数的方法

    自定义函数中调用自定义函数 在我们编写C语言程序时,可以将要经常用到的或者有自己单独作用的那一部分代码独立成一个函数,不仅可以简化我们的程序,还可以使我们的程序更加可见话. 正文阿巴阿巴 方法一:直接 ...

  7. C语言学习-调用自定义函数

    如何调用自定义函数 编写一个程序,生成以下输出: Brazil, Russia, India, China India, China, Brazil, Russia 除了main以外,该程序还要调用两 ...

  8. Access查询中如何调用自定义函数

    今天我们给大家分享一下Access查询中调用自定义函数. 在Access的查询中可以直接调用自定义函数,可以帮助我们解决实际工作中一些特殊的查询统计. 接下来,小编用一个网友的问题来教大家调用,我们来 ...

  9. php调用sap端rfc接口,SAP 接口编程之 RFC 系列(15) : 调用自定义函数

    从外部环境调用自定义函数 (FM, Function Module)与调用 SAP 内置的函数并没有不同,需要注意的是在 SAP 系统自定义 FM 的要点: 1)FM 必须是 Remote-enabl ...

最新文章

  1. httpTomcat
  2. python处理数据的优势-【Python数据分析基础】: 数据缺失值处理
  3. 电商人:别再跟数据透视表苦苦挣扎,这个报表神器才是你最后出路
  4. modal 弹出层后禁止底层滚动
  5. adminlte中数据表格datatable.js中的完整使用方法小案例
  6. pp助手苹果版_PP助手将下架?越狱时代已经过去,到底是该喜该悲
  7. 开源服务器日志审计系统,开源日志管理系统
  8. python爬取2017年统计用区划代码和城乡划分代码(截止2017年10月31日)
  9. 互联网公司的三高问题
  10. HOJ 4585 Shaolin(map, 迭代器)
  11. uniapp 安卓快捷方式插件(桌面长按app图标) Ba-Shortcut
  12. 3个基于 Spring Boot 的图片识别处理系统
  13. Android 如何解决默认壁纸更改为ImageWallpaper之外的壁纸,在特定的操作下,导致死机的问题。
  14. 基于TI-RTOS的CC2650DK开发(20)---硬件抽象层
  15. 【解读黑客】何为Rootkit?
  16. 如何清理windows server 2008 R2 中winsxs文件夹
  17. 安卓app单webview改为多webview加载网页
  18. PHP连接MSSQL配置和PHP代码演示
  19. Android 类似淘宝的多商品订单评价
  20. MySQL数据库安装,配置My.ini文件

热门文章

  1. python一个中文占几个字节_python中英文字母和中文汉字所占的字节
  2. libjpeg-turbo在Windows VS2010下的编译
  3. 将图片嵌入程序文件的一点研究
  4. 【Flink】Flink Heartbeat of TaskManager with id timed out.
  5. 95-190-544-源码-window-清除器(Evictors)-DeltaEvitor简介
  6. 【Mac】setremotelogin: Turning Remote Login on or off requires Full Disk Access privileges.
  7. Flink专栏:栏目订阅 概述
  8. 03-谷歌浏览器安装Sence
  9. 云计算教程学习入门视频课件:常用数据库排名
  10. 竟然有一半的人不知道 for 与 foreach 的区别???