C# XSLT转换不返回任何内容
我正在尝试创建一个基于XSLT转换的小型代码生成器。我对XSLT相当陌生,似乎我在转换中犯了错误(不确定在哪里)。我有两个转换(main和util),元数据从XML文件中提取(它存储关于表名的信息,将用于类生成-表名=类名;列名=字段名)。以下是我的转变: 主要转变C# XSLT转换不返回任何内容,c#,xslt,code-generation,C#,Xslt,Code Generation,我正在尝试创建一个基于XSLT转换的小型代码生成器。我对XSLT相当陌生,似乎我在转换中犯了错误(不确定在哪里)。我有两个转换(main和util),元数据从XML文件中提取(它存储关于表名的信息,将用于类生成-表名=类名;列名=字段名)。以下是我的转变: 主要转变 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/
<?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"
xmlns:dbs="http://kadgen/DatabaseStructure">
<xsl:import href="..\MySolution\UtilTemplates.xslt"/>
<xsl:output method="text" encoding="UTF-8" indent="yes"/>
<xsl:param name="Name"/>
<xsl:param name ="filedName"/>
<xsl:template match="/">
<xsl:apply-templates select=
"//dbs:DataStructure//dbs:Table[@Name='Customer']"
mode="BuildClasses" />
</xsl:template>
<xsl:template match="dbs:Table" mode="BuildClasses">
<xsl:call-template name="Header"/>
Public Class <xsl:value-of select="@Name"/>
{
<xsl:call-template name="ClassConstructors"/>
<xsl:call-template name="ClassLevelDeclarations"/>
<xsl:call-template name="FieldAccessProperties"/>
}
</xsl:template>
<xsl:template name="ClassConstructors">
</xsl:template>
<xsl:template name="ClassLevelDeclarations">
</xsl:template>
<xsl:template name="FieldAccessProperties">
</xsl:template>
</xsl:stylesheet>
执行上述代码后,我得到的唯一结果是空的cs文件。它可能看起来很坚固,但请你仔细看看,帮我解决这个问题
谢谢。这对我有用,但我做了一些小改动并修复了您的XML文档 这是我的测试应用程序
private static void Main(string[] args)
{
var myXslTrans = new XslCompiledTransform();
var doc = new XmlDocument();
doc.LoadXml(GetResourceTextFile("ProjectName.MainTransform.xslt"));
myXslTrans.Load(doc);
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var xsltArgs = new XsltArgumentList();
xsltArgs.AddParam("Name", "", "test name");
xsltArgs.AddParam("filedName", "", "test filed name");
var docXml = new XmlDocument();
docXml.LoadXml(GetResourceTextFile("ProjectName.Test.xml"));
myXslTrans.Transform(docXml, xsltArgs, sw);
var test = sw.ToString();
}
public static string GetResourceTextFile(string filename)
{
string result = string.Empty;
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(filename))
{
if (stream != null)
{
using (var sr = new StreamReader(stream))
{
result = sr.ReadToEnd();
}
}
}
return result;
}
我所做的主要区别是添加XSLT参数,并首先将嵌入的文件加载到XmlDocuments中。我不能复制空白输出,所以我不能确定您的问题的根本原因是什么。 < P>您是否尝试用VS XSLT调试器调试XSLT文件? 看起来它生成了正确的输出。
您在xsl和数据文件中对
xmlns:dbs
有不同的定义,不是吗?很抱歉,这是一个键入错误。您的XML标记格式不正确:它缺少
元素的结束标记。也许这就是问题所在?嗨,有一个结束标记,就在标记的正下方。既然@Jason,是的,但你最初的问题中没有这个标记。嗨,我已经阅读了调试XSLT的教程,似乎我使用了(作为调试的输入)旧版本的XML文档,我的XSLT为util部分调用了错误的模板。谢谢你提到这件事。Chears,因为这件“愚蠢”的事,我撞了好一阵子头。谢天谢地,问题出现了,因为我首先使用了错误的XML,这就是为什么我不能调试或做任何事情。你的方法对我来说似乎有点长,但我会找到自己的方法来适应它。再次感谢!
<?xml version="1.0" encoding="utf-8" ?>
<dbs:MetaDataRoot FreeForm="true" xmlns:dbs="http://kadgen/DatabaseStructure">
<dbs:DataStructures>
<dbs:DataStructure Name="ASPDatabase">
<dbs:Tables>
<dbs:Table Name="Customer" OriginalName="Customer">
<dbs:TableColumns>
<dbs:TableColumn Name="CustomerID" NETType="int" IsPrimaryKey="true" />
<dbs:TableColumn Name="Name" NETType="string" IsPrimaryKey="false"/>
</dbs:TableColumns>
<dbs:TableConstraints>
<dbs:PrimaryKey>
<dbs:PKField Name="CustomerID"/>
</dbs:PrimaryKey>
</dbs:TableConstraints>
</dbs:Table>
</dbs:Tables>
</dbs:DataStructure>
</dbs:DataStructures>
</dbs:MetaDataRoot>
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load("xslt transformation location");
myXslTrans.Transform("XML source location", "Empty class file location");
private static void Main(string[] args)
{
var myXslTrans = new XslCompiledTransform();
var doc = new XmlDocument();
doc.LoadXml(GetResourceTextFile("ProjectName.MainTransform.xslt"));
myXslTrans.Load(doc);
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var xsltArgs = new XsltArgumentList();
xsltArgs.AddParam("Name", "", "test name");
xsltArgs.AddParam("filedName", "", "test filed name");
var docXml = new XmlDocument();
docXml.LoadXml(GetResourceTextFile("ProjectName.Test.xml"));
myXslTrans.Transform(docXml, xsltArgs, sw);
var test = sw.ToString();
}
public static string GetResourceTextFile(string filename)
{
string result = string.Empty;
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(filename))
{
if (stream != null)
{
using (var sr = new StreamReader(stream))
{
result = sr.ReadToEnd();
}
}
}
return result;
}