【问题标题】:XSLT transformation does not return anythingXSLT 转换不返回任何内容
【发布时间】:2012-02-15 05:27:47
【问题描述】:

我正在尝试创建一个基于 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/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>

这里是 util 转换:

<?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 有不同的定义,不是吗?
  • 这是一个打字错误,很抱歉。
  • 您的 XML 标记格式不正确:它缺少 &lt;dbs:Tables&gt; 元素的结束标记。也许这就是问题所在?
  • 您好, 有一个结束标签,它位于 标签的正下方。
  • 现在@Jason has fixed it,是的,但你原来的问题中没有那个标签。

标签: c# xslt code-generation


【解决方案1】:

您是否尝试过使用 VS XSLT 调试器调试您的 XSLT 文件? 看起来它会产生正确的输出。

【讨论】:

  • 您好,我浏览了调试 XSLT 的教程,看来我使用了(作为调试的输入)旧版本的 XML 文档,而我的 XSLT 为 util 部分调用了错误的模板。感谢您提及这一点。谢尔。
  • 因为这个“愚蠢”的事情,我一直在敲我的头。谢尔。
【解决方案2】:

这对我有用,但我做了一些小改动并修复了您的 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,这就是为什么我无法调试或任何东西。你的方法对我来说似乎有点长,但我会找到自己的方式来适应它。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2020-04-27
  • 2019-04-06
  • 2012-02-15
  • 2020-09-07
  • 2021-11-22
  • 2015-11-06
相关资源
最近更新 更多