网站开发流程可规划为那三个阶段,服务器可以吧网站做跳转吗,wordpress中文变英文,紧急大通知请记住新域名一、前言 紧跟着上一篇随笔#xff0c;本文主要涉及到如何将xml与xsl动态转换成html#xff0c;这个才是最关键的地方#xff0c;所有的内容都是围绕这个主题来进行开展的。根据指定的xsl样式将ListT转换相应的Html#xff0c;相关的随笔如下#xff1a; #xf…一、前言 紧跟着上一篇随笔本文主要涉及到如何将xml与xsl动态转换成html这个才是最关键的地方所有的内容都是围绕这个主题来进行开展的。根据指定的xsl样式将ListT转换相应的Html相关的随笔如下 一、将ListT转换成DataTable。 二、将Xml与Xsl动态转换成Html。 三、设置以及控制Xsl的内容样式。 二、XslTransform的具体实现 XslTransform主要的职责为将xml与xsl动态转换成html。其中XslCompiledTransform 提供了很多方法可以进行相关的转换但使用起来并不是十分方便因此必须在该基础上来对目前的类进行相关封装以及提取。具体的代码如下 1 public class XslTransform : IDisposable 2 { 3 public StringWriter StringWriter 4 { 5 get; 6 private set; 7 } 8 9 public StringReader XmlStringReader10 {11 get;12 private set;13 }14 15 public StringReader XslStringReader16 {17 get;18 private set;19 }20 21 public XslTransform()22 {23 this.StringWriter new StringWriter();24 }25 26 public string Transfer(string xmlText, string xslText)27 {28 if (string.IsNullOrWhiteSpace(xmlText)29 || string.IsNullOrWhiteSpace(xslText))30 {31 return string.Empty;32 }33 this.XmlStringReader new StringReader(xmlText);34 this.XslStringReader new StringReader(xslText);35 36 return TransferXmlAndXslToHtml();37 }38 39 private string TransferXmlAndXslToHtml()40 {41 try42 {43 using (XmlTextWriter writer new XmlTextWriter(this.StringWriter))44 {45 return ToHtml(writer);46 }47 }48 catch49 {50 return string.Empty;51 }52 }53 54 private string ToHtml(XmlTextWriter writer)55 {56 XslCompiledTransform xslTransform new XslCompiledTransform();57 xslTransform.Load(XmlReader.Create(this.XslStringReader));58 xslTransform.Transform(XmlReader.Create(this.XmlStringReader), writer);59 60 return this.StringWriter.ToString();61 }62 63 #region IDisposable 成员64 65 public void Dispose()66 {67 this.Dispose(true);68 GC.SuppressFinalize(this);69 }70 71 private void Dispose(bool disposing) 72 {73 if (this.StringWriter ! null)74 {75 this.StringWriter.Dispose();76 }77 if (this.XslStringReader ! null)78 {79 this.XslStringReader.Dispose();80 }81 if (this.XmlStringReader ! null)82 {83 this.XmlStringReader.Dispose();84 }85 }86 87 #endregion88 } XslTransform 类主要的方法为54-61行的代码如下所示 54 private string ToHtml(XmlTextWriter writer)55 {56 XslCompiledTransform xslTransform new XslCompiledTransform();57 xslTransform.Load(XmlReader.Create(this.XslStringReader));58 xslTransform.Transform(XmlReader.Create(this.XmlStringReader), writer);59 60 return this.StringWriter.ToString();61 } 第57行加载XSL的样式文本58行在原有基础上将XML转换成XmlTextWriter对象。其中XmlTextWriter在初始化时StringWriter对象作为参数传递进去如以下的43行代码 43 using (XmlTextWriter writer new XmlTextWriter(this.StringWriter)) 因此直接返回this.StringWriter.ToString();就获取到了我们所需的Html了。 其次XslTransform 类还有一个注意的要点实现IDisposable接口主要是将用到的资源及时释放掉避免造成其他影响。 三、Xsl文件的设置以及添加到资源文件中 1创建MapperInfoXslContent.xslt样式文件内容如下目前使用最简单的不做任何处理的样式文件 View Code ?xml version1.0 encodingutf-8?xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xsl:template match/ html head titledemo/title /head body table tr td table border1px bordercolor#000000 cellspacing0px styleborder-collapse:collapse tr bgcolor#9acd32 th width80Name/th th width80Value/th th width80Percent/th th width230CreatedTime/th th width60IsActive/th th width190TargerUrl/th /tr xsl:for-each selectDataSet/MapperInfo tr td bgcolor#ff00ff width80 xsl:value-of selectName/ /td td width80 xsl:value-of selectValue/ /td td bgcolor#ff00ff width80 xsl:value-of selectPercent/ /td td width230 xsl:value-of selectCreatedTime/ /td td bgcolor#ff00ff width60 xsl:value-of selectIsActive/ /td td width190 xsl:value-of selectTargetUrl/ /td /tr /xsl:for-each /table /td /tr /table /body /html /xsl:template/xsl:stylesheet 2然后再创建XslResource.resx资源文件将MapperInfoXslContent.xslt样式文件添加到XslResource.resx资源文件中如下图所示 四、转换后的效果 经过转换后得到的Html显示效果如下测试过程中可以以HTML格式来查看字符串 五、相关的单元测试 示例的单元测试代码如下仅做了一些最基础的测试验证内容是否存在 View Code [TestMethod()] public void TransferTest() { string xmlText GetXmlText(); string xslText XslResource.MapperInfoXslContent; string htmlContent string.Empty; using (XslTransform xslTransform new XslTransform()) { htmlContent xslTransform.Transfer(xmlText, xslText); } Assert.IsTrue(!string.IsNullOrWhiteSpace(htmlContent)); Assert.IsTrue(htmlContent.Contains(true)); Assert.IsTrue(htmlContent.Contains(false)); for (int index 0; index 3; index) { Assert.IsTrue(htmlContent.Contains( string.Concat(MapperInfoIndex, index.ToString()))); Assert.IsTrue(htmlContent.Contains( string.Format(www.codeplex.com?Id{0}, index))); Assert.IsTrue(htmlContent.Contains(index.ToString())); } } private string GetXmlText() { ListMapperInfo entities CreateMapperInfos(3); DataTable dataTable EntityMapper.ToDataTableMapperInfo(entities); DataSet dataSet new DataSet(DataSet); dataSet.Tables.Add(dataTable); return dataSet.GetXml(); } private ListMapperInfo CreateMapperInfos(int count) { ListMapperInfo entities new ListMapperInfo(); for (int index 0; index count; index) { entities.Add(new MapperInfo() { Name string.Concat(MapperInfoIndex, index.ToString()), IsActive (index % 2 0 ? true : false), CreatedTime DateTime.Now, Value index, Percent GetPercent(index), TargetUrl string.Format(www.codeplex.com?Id{0}, index) }); } return entities; } private decimal? GetPercent(int index) { if (index % 2 0) { return index; } return null; } 六、总结 上面涉及的仅仅是其中的一种代码应该是比较精简的。还有另外一种采用XPathNavigator的也就是笛子说的“如果使用 XmlWriter 或 XmlDocument则可以避开这个问题。另外XslCompiledTransform.Transform 方法重载了几个版本中如果我没记错的话最应优先使用的是xml数据源为 XPathNavigator 的版本。”。关于这种情况可以通过XmlDocument来创建相关的XPathNavigator对象即XPathNavigator navigator XmlDocument.DocumentElement.CreateNavigator()这种版本的我也重写了一份但是好像没有转换成功因此就采用这种模式了。下一篇主要涉及到XSL样式的设计以及相关的函数、模板的应用。转载于:https://www.cnblogs.com/aaa6818162/archive/2011/05/27/2060134.html