2013-05-01 2 views
1

저는 xslt을 처음 사용하고 xslt를 사용하여 두 xml을 하나로 결합해야합니다. 처음 연습으로 file1.xml, file2.xml 및 transform.xslt의 세 파일을 만들고 file1.xml을 직접 실행하여 파일을 병합하는 방법을 알아 냈습니다. file1.xml에서ASP.NET에서 두 xml 파일을 xslt와 병합

: 이것은 내가 그것을 어떻게입니다

file2.xml에서
<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="transform.xslt"?> 
<stuff> 
    ... 
</stuff> 

:

을 Transform.xslt에서
<morestuff> 
    ... 
</morestuff> 

:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:custom="custom-functions"> 
    <xsl:output method="xml" indent="yes" version="1.0" encoding="ISO-8859-1"/> 
    <xsl:variable name="file2" select="document('file2.xml')" /> 
    <xsl:doing-stuff> 
     ... 
     <!-- contains references to $file2 --> 
     ... 
    </xsl:doing-stuff> 
</xsl:stylesheet> 

하지만 필요 내 C# ASP.NET 코드를 통해이 작업을 수행 할 수 있고 주어진 xml을 사용하는 문자열 xml 대신 파일. 좋아요 :

public string MergeXmls(string xml1, string xml2){ 
    string mergedXml; 
    var xsltPath = HttpContext.Current.Server.MapPath("transform.xslt"); 
    //??? 
    return mergedXml; 
} 

어떻게하면됩니까? 나는 transform.xslt에서 document('file2.xml')에 대한 참조를 삭제해야한다는 것을 알고 있지만, 거기에서 어디로 가야할지 모르겠습니다. 나는이 같은 System.Web.UI.WebControls.Xml 개체를 사용하는 프론트 엔드 웹 페이지에서

답변

1

이것은 XmlPreloadedResolver 클래스를 사용하여 수행 할 수 있습니다. 이렇게하면 XSLT의 document 함수를 확인하는 데 사용할 엔터티를 미리로드 할 수 있습니다.

주의해야 할 점은 URI 년대 document 함수에 지정된는 당신이 XmlReader를 통해로드 약간 복잡한 방법을 사용 할 수 있도록 그래서 당신은을 무시할 수는 XSLT 문서 자체의 기본 URI를 기준으로 처리된다는 것이다 기본 URI.

public string MergeXml(string xml1, string xml2) 
{ 
    XslCompiledTransform xslt = new XslCompiledTransform(); 
    XmlDocument xsltDoc = new XmlDocument(); 
    // Load the XSLT file through XmlReader to override the base URI. 
    using(StreamReader reader = File.OpenText(HttpContext.Current.Server.MapPath("transform.xslt"))) 
    using(XmlReader xmlReader = XmlReader.Create(reader, null, "file:///transform.xslt")) 
    { 
     xsltDoc.Load(xmlReader); 
    } 
    // Use XsltSettings to enable the use of the document() function. 
    xslt.Load(xsltDoc, new XsltSettings(true, false), null); 

    // Load the first XML file into a document 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml1); 

    // Create the resolver and add the second file to it. 
    XmlPreloadedResolver resolver = new XmlPreloadedResolver(); 
    resolver.Add(new Uri("file:///file2.xml"), xml2); 

    using(StringWriter writer = new StringWriter()) 
    using(XmlWriter xmlWriter = XmlWriter.Create(writer)) 
    { 
     // Pass the resolver to the transform 
     xslt.Transform(doc, null, xmlWriter, resolver); 
     return writer.ToString(); 
    } 
} 

XmlPreloadedResolver 클래스는 닷넷 4.0 이상에서만 사용할 수 있지만 이전 버전을 사용하는 경우 당신은 여전히 ​​System.Xml.XmlResolver에서 사용자 정의 클래스를 파생와 유사한 기능을 직접 구현할 수 있습니다.

+0

.Net 4.0을 사용하고 있으며 완벽하게 작동합니다! 고맙습니다! – Kalina

1

: 것입니다 내 기능 뒤에 코드에서

<asp:Xml ID="xmlDisplay" runat="server" /> 

뭔가 같은 :

public void MergeXmls(string xml1, string xml2) 
{ 
    string mergedXml = "<root>" + xml1 + xml2 + "</root>; 
    xmlDisplay.DocumentContent = mergedXml; 
    xmlDisplay.TransformSource = Server.MapPath("transform.xslt"); 
} 

페이지를로드하면 xmlDisplay 객체는 mergedXml에있는 XML 문자열의 데이터를 XSLT로로드 한 결과를 보유합니다.

여기에 제공된 코드 샘플은 매개 변수로 전달 된 2 개의 문자열에서 유효한 XML 문자열을 만드는 방법을 설명하지 않고 단순히 경우에 따라 사용할 수있는 2 개의 문자열을 연결합니다.

그러면 XPath와 데이터 요소가 mergedXml 문자열에있는 요소의 경로와 일치하도록 XSLT를 조정해야합니다. XSLT에는 소스 XML 데이터 파일에 대한 참조가 없습니다.

희망이 있습니다.

+0

고마워요,하지만 [이 예제에서]와 같은 ID를 일치 시켜서 xslt를 사용하여 병합하려고했습니다. (http://stackoverflow.com/questions/1510688/xslt-a-simple-way-to-merge-xml-files), 다른 하나에 추가하는 것뿐만 아니라 xsl 변환을 수행하는 _then_. – Kalina