2016-06-26 2 views
0

하나의 파일에 여러 xml 파일을 병합해야한다는 요구 사항이 있습니다. xsl transform을 사용하여이 작업을 수행했습니다. 내 XSLT 파일은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:Utils="Utils:Helper"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="assemblies"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
     <xsl:apply-templates select="document('AdminService.xml')/reflection/assemblies/*" /> 
     <xsl:apply-templates select="document('Helpers.xml')/reflection/assemblies/*" /> 
     <!--<xsl:value-of select="Utils:GetFiles()"/>--> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="apis"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
     <xsl:apply-templates select="document('AdminService.xml')/reflection/apis/*" /> 
     <xsl:apply-templates select="document('Helpers.xml')/reflection/assemblies/*" /> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

내 C# 기능이 EmployeeService, AdminService이 도우미는 하나의 파일은 Results.xml에 병합이 세 가지 XML 파일에

var xslt = new XslCompiledTransform(); 
      xslt.Load("XmlMerger.xslt", new XsltSettings { EnableDocumentFunction = true, EnableScript = true}, null); 


using (var writer = File.CreateText("XmlDocs\\result.xml")) 
{ 
       xslt.Transform(@"EmployeeService.xml", arguments, writer); 
} 

입니다. 이것은 나를 위해 잘 작동합니다.

이제 XML 파일의 호출 내가 디렉토리에있는 모든 XML 파일을 포함 할 필요가

<xsl:apply-templates select="document('AdminService.xml')/reflection/assemblies/*" /> 
<xsl:apply-templates select="document('Helpers.xml')/reflection/assemblies/*" />. 

정적이다. 현재 내가

public string GetFiles() 
     { 
      return "<xsl:apply-templates select=\"document(\'Helpers.xml\')/reflection/assemblies/*\" />"; 

      //return "Helpers.xml"; 
     } 

주와 같은 문자열을 전달하여이 XSLT 파일에서 호출하는 C#을 기능에 의해 시도 : 그냥 예를 들어 나는 하나의 파일 만 포함되어 있습니다. 여기에서 나는 XSLT 파일

<xsl:value-of select="Utils:GetFiles()"/> 

에 전달하지만 결과는 일반 텍스트로 나오는 그 문자열을 구축을 위해 노력하고 있습니다. 어떻게 이것을 벗어나서 그것의 템플리트 나 디렉토리에서 모든 파일을 동적으로 포함시키는 방법을 말해 주나요?

답변

1

당신은 XML 문서의 디렉토리를 처리하려면 다음 다음 XPathNavigator 객체의 배열에 전달해야합니다, 당신의 C# 코드에서 XPathNavigator에 전달해야 XslCompiledTransform와 XSLT의 XML 문서를 처리하려면 . 그래서 당신은, 샘플 클래스 MyHelperClass의 방법

public XPathNavigator[] GetDocuments(string directory) 
    { 
     return Directory.EnumerateFiles(directory, "*.xml").Select(file => new XPathDocument(file).CreateNavigator()).ToArray(); 
    } 

쓰기 당신의 C# 코드에서 클래스를 인스턴스화하고 Transform 전화의 확장으로 전달할 수 있습니다 예를 들어, 당신의 XSLT의 사용 그리고

 XslCompiledTransform xsltProc = new XslCompiledTransform(); 
     xsltProc.Load("XSLTFile1.xslt"); 

     XsltArgumentList xsltArgs = new XsltArgumentList(); 
     xsltArgs.AddExtensionObject("http://example.com/mf", new MyHelperClass()); 

     xsltProc.Transform("input.xml", xsltArgs, Console.Out); 

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="msxsl mf" 
> 

다음으로 처리 할 수 ​​있습니다.

<xsl:apply-templates select="mf:GetDocuments('someDirectoryName')/root/foo/bar"/> 

는 디렉토리에있는 XML 문서에있는 모든 bar 요소를 처리합니다.

+0

고마워요. 나를위한 큰 도움! – shanmugharaj

관련 문제