.Net平台下基于Xslt的代码生成组件的实现

来源:互联网 发布:c语言!=eof怎么用 编辑:程序博客网 时间:2024/05/16 17:40

1.准备知识:

    (1)Xslt是什么? 

                在计算机科学中,XSLT是 扩展样式表转换语言 的外语缩写,这是一种对XML(标准通用标记语言的子集)文档进行转化的语言,XSLT中的T代表英语中的“转换”(Transformation)。它是XSLeXtensible 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


本人菜鸟,第一次发帖,写的不好还请海涵,欢迎前来交流和多提建议

阅读全文
0 0
原创粉丝点击