2012-02-14 8 views
1

XSLT 변환을 기반으로 작은 코드 생성기를 만들려고합니다. 나는 오히려 XSLT에 익숙하지 않고, 내가 변형 된 부분에서 오류를 만들었다 고 생각한다. 나는 두 가지 변환 (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가 util 부분에 잘못된 템플릿을 호출하는 것으로 보입니다. 이것을 언급 해 주셔서 감사합니다. Chears. –

+0

나는이 "어리석은"일 때문에 내 머리를 꽤 오랫동안 두드렸다. Chears. –

관련 문제