程晓晖

博客园 首页 新随笔 联系 订阅 管理

Xslt语法中使用.NET对象(Xslt Working with Extension Objects)

         今天发现XsltArgumentList有一个AddExtensionObject的方法,能够使得在xslt文件中调用.NET对象的方法来进行输出和设置,感觉还是有些用的。

         下面结合一个使用场景来说明下,从数据库获取到的日期可能是2011-10-17 16:00:00这种格式的,在使用xslt将xml转化为html后,希望显示的格式是2011年10月17日 16:00。先列出YiZhu.xml文件内容,其中包含了2条数据:

01 <YiZhuList>
02     <YiZhu>
03         <MingCheng>
04             吸氧
05         </MingCheng>
06         <KaiShiSj>
07             2011-10-17 16:00:00
08         </KaiShiSj>
09         <PinCi>
10             Always
11         </PinCi>
12     </YiZhu>
13     <YiZhu>
14         <MingCheng>
15             阿莫西林
16         </MingCheng>
17         <KaiShiSj>
18             2011-10-17 12:00:00
19         </KaiShiSj>
20         <PinCi>
21             TID
22         </PinCi>
23     </YiZhu>
24 </YiZhuList>

                  然后贴一下YiZhu.xslt的内容:

01 <?xml version="1.0" encoding="utf-8"?>
02 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
03     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
04     <xsl:output method="html" indent="yes"/>
05     <xsl:template match="/">
06         <table style="border:1px solid #FFFFF">
07             <tr>
08                 <td>医嘱名称</td>
09                 <td>开始时间</td>
10                 <td>频次</td>
11             </tr>
12             <xsl:for-each select="YiZhuList/YiZhu">
13                 <tr>
14                     <td>
15                         <xsl:value-of select="MingCheng"/>
16                     </td>
17                     <td>
18                         <xsl:value-of select="KaiShiSj"/>
19                     </td>
20                     <td>
21                         <xsl:value-of select="PinCi"/>
22                     </td>
23                 </tr>
24             </xsl:for-each>
25         </table>
26     </xsl:template>
27 </xsl:stylesheet>

        生成的html如下图所示,我们希望时间按指定格式输出,且最好能使用熟悉且方便的.NET格式字符串而不是xsl的函数。

      image

         最容易想到自然就是操作Xml文档内容,做一个循环,SelectSingleNodeXX,然后修改其值。这样做肯定能实现的,相比较下面要介绍的方法主要的弊端在于事先已经“假设”Xml文档结构了,知道某某要改某某节点的某某内容或属性。

          下面介绍如何在Xslt语法中使用.NET对象的方法,转换的代码稍微改一下,加入XSLT参数,代码如下:

01 //加载XML数据
02 XmlDocument doc = new XmlDocument();
03 doc.Load(Server.MapPath("YiZhu.xml"));
04  
05 //xslt转换器
06 XslCompiledTransform xct = new XslCompiledTransform();
07 //加载xslt文件
08 xct.Load(Server.MapPath("YiZhu.xslt"));
09  
10 //xslt参数
11 XsltArgumentList xal = new XsltArgumentList();
12 //添加DateFormatter的对象,命名空间为dateformat
13 xal.AddExtensionObject("urn:dateformat", new DateFormatter());
14              
15 StringBuilder sb = new StringBuilder();
16 StringWriter sw = new StringWriter(sb);
17 XmlTextWriter xtw = new XmlTextWriter(sw);
18 //转换得到输出内容
19 xct.Transform(doc, xal, xtw);
20  
21 Response.Write(sb.ToString());

        接着要做的就是在YiZhu.xsl文件头添加要使用的命名空间,与代码对应的的值是dateFormarter="urn:dateformat",然后将修改为

<xsl:value-of select="dateFormarter:Formate(KaiShiSj,'yyyy年MM月dd日 hh:mm')"/>,其中Formater就是DateFormatter类的成员函数,DateFormartter的代码如下:

01 public class DateFormatter
02    {
03        private string preString;
04  
05        public string Formate(string preString, string formatString)
06        {
07            this.preString = preString;           
08            return Formate(formatString);
09        }
10  
11        public string Formate(string formatString)
12        {
13            DateTime da = new DateTime();
14            bool result = DateTime.TryParse(this.preString,out da);
15            if(!result)
16                return string.Empty;
17  
18            return da.ToString(formatString);
19        }
20    }

          更改后输出的效果如下:

        无标题

          总结:通过示例可以看到,使用Extension Objects使得Xslt转换过程中可以调用.NET对象方法,进一步的可以在转换过程中插入业务逻辑,相比较直接操作转换前的XML数据显得更加灵 活,且对XML数据源透明,XSLT文件可以按需修改且不用重新编译发布,岂不美哉?

转自:  http://www.cnblogs.com/xiaopang2010/archive/2011/10/17/2215674.html

posted on 2011-10-18 17:27  fumen  阅读(258)  评论(0编辑  收藏  举报