XSLT转换没有返回任何内容

3
我正在尝试基于XSLT转换创建一个小的代码生成器。我对XSLT还比较陌生,似乎在我的转换中出现了错误(不确定是哪里)。我有两个转换(主要和工具),元数据从XML文件中提取(它存储有关表名称的信息,这些信息将用于类生成-表名称=类名称;列名称=字段名称)。以下是我的转换:
主要转换:
<?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>

这是一个有用的转换:

<?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="text"/>
    <xsl:template name="Header">      
     using System;
     using System.Collections.Generic;
     using System.Xml;     
     using System.Linq;
     using System.Text;
    </xsl:template>  
</xsl:stylesheet>

这是我的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");

执行上述代码后,我得到的只是一个空的cs文件。尽管它看起来很强大,但请您详细查看并帮助我解决此问题。
谢谢。

你在xsl和数据文件中对于xmlns:dbs有不同的定义,是吗? - GSerg
那是一个打字错误,抱歉。 - Мitke
您的XML标记不是格式良好的:缺少<dbs:Tables>元素的结束标记。也许这就是问题所在? - Frédéric Hamidi
嗨,dbs:Table标签的正下方有一个dbs:Tables的闭合标签。 - Мitke
既然@Jason已经修复了它,是的,但是那个标签在你最初的问题中并不存在。 - Frédéric Hamidi
Jason,感谢你为我修复XML。@Frederic,如果我的打字错误增加了混乱,我很抱歉(下次在发布之前我会评估我的XML),感谢您的评论。干杯!:D - Мitke
2个回答

2

你尝试过使用VS XSLT调试器来调试你的XSLT文件吗? 看起来它生成了正确的输出。 调试器截图


嗨,我已经学习了有关调试XSLT的教程,看起来我使用了旧版本的XML文档(作为调试输入),而我的XSLT在util部分调用了错误的模板。感谢您提到这一点。谢谢。 - Мitke
我因为这个“愚蠢”的问题苦思冥想了很长时间。干杯。 - Мitke

1

这对我有用,但我做了一些小改动并修复了您的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中。我无法重现空白输出,因此无法确定您问题的根本原因。

谢谢,问题是由于我一开始使用了错误的XML,所以我无法进行调试或其他操作。你的方法对我来说有点长,但我会找到自己的方法来适应它。再次感谢! - Мitke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接