如何将ListT转换相应的Html(xsl动态转换)(二)
緊跟著上一篇隨筆,本文主要涉及到如何將xml與xsl動態轉換成html,這個才是最關鍵的地方,所有的內容都是圍繞這個主題來進行開展的。根據指定的xsl樣式將List<T>轉換相應的Html,相關的隨筆如下:
(一)、將List<T>轉換成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?XmlStringReader
10?????????{
11?????????????get;
12?????????????private?set;
13?????????}
14?
15?????????public?StringReader?XslStringReader
16?????????{
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?????????????try
42?????????????{
43?????????????????using?(XmlTextWriter?writer?=?new?XmlTextWriter(this.StringWriter))
44?????????????????{
45?????????????????????return?ToHtml(writer);
46?????????????????}
47?????????????}
48?????????????catch
49?????????????{
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?????????#endregion
88?????}
?
?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?version="1.0"?encoding="utf-8"?><xsl:stylesheet?version="1.0"?xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
??<xsl:template?match="/">?
????<html>
??????<head>
????????<title>demo</title>
??????</head>
??????<body>
????????<table>
??????????<tr>
????????????<td>
??????????????<table?border="1px"?bordercolor="#000000"?cellspacing="0px"?style="border-collapse:collapse">
????????????????<tr?bgcolor="#9acd32">
??????????????????<th?width="80">Name</th>
??????????????????<th?width="80">Value</th>
??????????????????<th?width="80">Percent</th>
??????????????????<th?width="230">CreatedTime</th>
??????????????????<th?width="60">IsActive</th>
??????????????????<th?width="190">TargerUrl</th>
????????????????</tr>
????????????????<xsl:for-each?select="DataSet/MapperInfo">
??????????????????<tr>
????????????????????<td?bgcolor="#ff00ff"?width="80">
??????????????????????<xsl:value-of?select="Name"/>
????????????????????</td>
????????????????????<td?width="80">
??????????????????????<xsl:value-of?select="Value"/>
????????????????????</td>
????????????????????<td?bgcolor="#ff00ff"?width="80">
??????????????????????<xsl:value-of?select="Percent"/>
????????????????????</td>
????????????????????<td?width="230">
??????????????????????<xsl:value-of?select="CreatedTime"/>
????????????????????</td>
????????????????????<td?bgcolor="#ff00ff"?width="60">
??????????????????????<xsl:value-of?select="IsActive"/>
????????????????????</td>
????????????????????<td?width="190">
??????????????????????<xsl:value-of?select="TargetUrl"/>
????????????????????</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()
????????{
????????????List<MapperInfo>?entities?=?CreateMapperInfos(3);
????????????DataTable?dataTable?=?EntityMapper.ToDataTable<MapperInfo>(entities);
????????????DataSet?dataSet?=?new?DataSet("DataSet");
????????????dataSet.Tables.Add(dataTable);
????????????return?dataSet.GetXml();
????????}
????????private?List<MapperInfo>?CreateMapperInfos(int?count)
????????{
????????????List<MapperInfo>?entities?=?new?List<MapperInfo>();
????????????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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的如何将ListT转换相应的Html(xsl动态转换)(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android传感器编程入门
- 下一篇: 页面添加复制代码功能