Мitke
Мitke

Reputation: 310

XSLT transformation does not return anything

I am trying to create a small code generator based upon XSLT transformation. I am rather new to XSLT, and it seems that I have made error (not sure where) in my transformations. I have two transformation (main and util), the metadata is pulled from XML file (it stores information about table names, which will be used for class generation- table name = class name; column name = field name ). Here are my transformations:

Main transformation

<?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>

Here is the util transformation:

<?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>

Here is part of my XML file:

<?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>

Here is how I start transformation:

    XslCompiledTransform myXslTrans = new XslCompiledTransform();
    myXslTrans.Load("xslt transformation location");
    myXslTrans.Transform("XML source location", "Empty class file location");

After executing above code, only thing I get is empty cs file. It may seem robust but please, go through it and help me with this.

Thanks.

Upvotes: 3

Views: 1882

Answers (2)

Gebb
Gebb

Reputation: 6546

Have you tried debugging your XSLT files with VS XSLT debugger? Looks like it generates correct output. Debugger screenshot

Upvotes: 2

Jason Rowe
Jason Rowe

Reputation: 6276

This is working for me but I made a couple of small changes and fixed your XML doc.

Here is my test app.

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;
}

The major differences I made were adding XSLT arguments and loading the embedded files into XmlDocuments first. I can't reproduce the blank output so I can't be sure what the root cause of your issue is.

Upvotes: 1

Related Questions