2012-02-14 12 views
1

XSLT変換に基づいて小さなコードジェネレータを作成しようとしています。私はむしろXSLTの新機能であり、私の変換ではエラーが発生しているように見えます。私は2つの変換(mainとutil)を持っています。メタデータはXMLファイルから取り出されます(テーブル名に関する情報が格納されています - テーブル名=クラス名;列名=フィールド名)。ここに私の変換は、次のとおりです。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" 
    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ファイルだけです。それは頑丈に見えますが、してください、それを通過して、これで私を助けてください。

ありがとうございました。

+0

xslの 'xmlns:dbs'とデータファイルの定義が違うのですか? – GSerg

+0

これは入力エラーです。申し訳ありません。 –

+0

XMLマークアップの形式が正しくありません。「」要素の終了タグがありません。多分それは問題ですか? –

答えて

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に読み込むことでした。私は空白の出力を再現することができないので、あなたの問題の根本的な原因がわからない。

+0

最初は間違ったXMLを使用していたので、問題が発生しました。そのため、デバッグできなかったのです。あなたのアプローチは私にとっては少し時間がかかるようですが、私はそれに適応するための自分の方法を見つけるでしょう。再度、感謝します! –

2

VS XSLTデバッガでXSLTファイルをデバッグしようとしましたか? 正しい出力を生成するように見えます。 Debugger screenshot

+0

こんにちは、私はXSLTのデバッグのためのチュートリアルを行った、私はXMLドキュメントの古いバージョンを(デバッグ用の入力として)使用しているようだと私のXSLTは、これに言及してくれてありがとう。チアーズ。 –

+0

私はこの「愚かな」事のためにかなり長い間頭を叩いていました。チアーズ。 –

関連する問題