在VS中使用XSLT处理XML

by Rwatermoon on 01月 11, 2010

在做下FTP载站的时候,发现贼寇给我的数据库中的Description的字段是一段资源介绍的XML,形式如下:


  <译名>职业杀手
  <片名>Contract Killers
  <年代>2008
  <国家>美国
  <类别>动作
  <语言>英语
  <字幕>英文/中文
  4.9/10 (208 votes)
  http://www.imdb.com/title/tt1001548
  <文件格式>X264 + AAC
  <视频尺寸>640x352
  <片长>90 min
  <导演>Justin B. Rhodes
  <主演>Frida Show ...  Jane (as Frida Farrell)
           Nick Mancuso ...  Witkoff
           Rhett Giles ...  Pernell
           Christian Willis ...  Lars
           G. Anthony Joseph ...  Monoven
           Steve Boergadine ...  Winston Scott
           Wolf Muser ...  Targonsky
           Lee Sherman ...  Alex
           Paul Cram ...  Chuck Dittmer
           Justin Smith ...  Rick
           rest of cast listed alphabetically:
           David Bermejo ...  Banker
           Julia Denton ...  Lindsay (as Julia Denton Francis)
           Jamie Marie Roebuck Joseph ...  Restaurant patron
           Elizabeth Judith ...  Waitress
           Jillian Kinsman ...  Aide 1
           Chase Link ...  FBI Agent
           Russell D. Mercier ...  Swat Officer
           Randy Molnar ...  White Hat CEO
           Randy Robinson ...  SWAT Team Leader
           Marc Shapins ...  FBI Agent
           Kim R. Smith ...  FBI Agent
           Leander Suleiman ...  Petrona
           Valensky Sylvain ...  Aide 2
           Brewier Welch ...  Subordinate FBI Agent
  <简介>
一个CIA的杀手试图摆脱她的合同过上正常的生活,但最终杀手系统还是追踪到并设计陷害她,她不得不走上曾经试图摆脱的复仇之路……

为了能把XML信息直接的显示出来,我选择使用XSLT处理这段XML,XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。关于XSLT请参考XSLT入门

首先我们需要一个类来把XML交给XSLT处理:

 public static class XSLTViewExtensions
    {
        public static void  RenderXML(this ViewPage page
        , XmlDocument xmlDocument
        ,  string  XSLTPath,
        Dictionary< string , string > xslArgParams)
    {
        ViewContext context  =  page.Html.ViewContext ;
         XsltArgumentList xslArgs  = new  XsltArgumentList() ;
        if  (xslArgParams !=null)
         {
             foreach  ( string  key  in  xslArgParams.Keys)
             {
                xslArgs.AddParam(key,  null ,xslArgParams[key]) ;
             }
        }
        XslCompiledTransform t  = new  XslCompiledTransform() ;
         t.Load(XSLTPath) ;
         t.Transform(xmlDocument, xslArgs,
            context.HttpContext.Response.Output) ;
     }
    }

然后在页面使用RenderXML方法:

            XDocument xdoc = XDocument.Load(new StringReader(item.Description));
            XElement xe = xdoc.Element("Root");
            var x = (from e in xe.Elements()
                     where e.Name == "简介"
                     select e).FirstOrDefault();

最后我们需要按照自己的需求定制XSLT文件:

简单的说XSLT可以把 XML 源树转换为 XML 结果树,通过XPath 在 XML 文档中进行导航,把一种XML文件转换成另一种XML文件,例如我就需要把上面XML中的标签去掉,然后在每个标签内容之间添加一些HTML标记。

转换用的XSLT文件:






  
  

  
  

    

      

        
          <xsl:value-of select="/Root/译名"/>
        


      

      
        
译名:
片名:
年代:
地区:
类别:
语言:
字幕:
IMDB评分:
IMDB链接:
文件格式:
视频尺寸:
文件大小:
片长:
导演:
主演:
简介:

如上所示,我通过匹配Root结点,然后用取得结点内容,在template中的任何内容都会被输出到结果,所以我们把需要的HTML标签添加了进去。

效果如下:
xslt

如此就完成了XML的解析与现实,XSLT其实还有很多可以发掘的地方,XPath也是一种灵活的语言,希望有兴趣的同学欢迎和我一起学习探讨……

Leave a Comment

Previous post:

</