1.准备知识:
(1)Xslt是什么?
在计算机科学中,XSLT是 扩展样式表转换语言 的外语缩写,这是一种对XML(标准通用标记语言的子集)文档进行转化的语言,XSLT中的T代表英语中的“转 换”(Transformation)。它是XSL(eXtensible Stylesheet Language)规范的一部分。
详见:http://baike.baidu.com/link?url=Sbf9eyxXTcHFzRRJUoGWxvYHD6MbqYxAlLQngHwF6tFMvxruacaqMpDQjmx6xgWfDyQhdN9p0bdSvMp9K1oyyq
(2)Xslt怎么写?
在W3School中有详尽的Xslt教程,http://www.w3school.com.cn/xsl/
2.具体实现
直接代码
首先实现Xml格式的数据源结点生成逻辑的接口ICodeGeneratorMember
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Yuri.Toolkit.CodeGenerator.Test
{
public class SampleGeneratorMember : ICodeGeneratorMember
{
public string Build(Dictionary<string, string> memberProperties)
{
return "<Property1>" + memberProperties["Property1"] + "</Property1><Property2>" + memberProperties["Property2"] + "</Property2>";
}
}
}
然后定义Xml格式的数据源模板
<?xml version="1.0" encoding="utf-8" ?>
<CodeGenerator>
<!--CodeGeneratorMembers
Ref属性为该Member的实现类路径,格式:Yuri.Toolkit.CodeGenerator.Test.SampleGeneratorMember,Yuri.Toolkit.CodeGenerator.Test
每个Properties的Property的Name属性必须唯一
-->
<Members>
<Member Name="SampleMember1" Ref="Yuri.Toolkit.CodeGenerator.Test.SampleGeneratorMember,Yuri.Toolkit.CodeGenerator.Test" >
<Properties>
<Property Name="Property1">${P1}</Property>
<Property Name="Property2">${P2}</Property>
</Properties>
</Member>
</Members>
<!--全局Properties,Property的Name属性必须唯一,调用格式:${PropertyName}-->
<Properties>
<Property Name="P1">111</Property>
<Property Name="P2"></Property>
</Properties>
</CodeGenerator>
再编写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" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
SampleMember1的第一个属性值为:<xsl:value-of select="CodeGenerator/SampleMember1/Property1"/>
SampleMember1的第二个属性值为:<xsl:value-of select="CodeGenerator/SampleMember1/Property2"/>
</xsl:template>
</xsl:stylesheet>
调用方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Yuri.Toolkit.CodeGenerator.Test
{
class Program
{
static void Main(string[] args)
{
string s1 = TestCodeGeneratorTemplate();
}
private static string TestCodeGeneratorTemplate()
{
ICodeGenerator codeGenerator = CodeGeneratorFactory.GetCodeGenerator();
Dictionary<string, string> props = new Dictionary<string, string>();
props.Add("P2", "789");
string xmlData = codeGenerator.TransformGeneratorTemplate("Sample", props);
string code = codeGenerator.GenerateCode("Sample", "Sample", props);
return code;
}
}
}
转换后的Xml数据源
<?xml version="1.0" encoding="utf-8"?>
<CodeGenerator>
<SampleMember1>
<Property1>111</Property1>
<Property2>789</Property2>
</SampleMember1>
<Properties>
<P1>111</P1>
<P2>789</P2>
</Properties>
</CodeGenerator>
转换后结果:
SampleMember1的第一个属性值为:111 SampleMember1的第二个属性值为:789
最后附上项目代码:链接:http://pan.baidu.com/s/1slk9q7F 密码:uxl4
本人菜鸟,第一次发帖,写的不好还请海涵,欢迎前来交流和多提建议