programing

C#에서 XSLT 스타일시트를 적용하는 방법

muds 2023. 9. 23. 23:08
반응형

C#에서 XSLT 스타일시트를 적용하는 방법

저는 XSLT 스타일시트를 C#을 이용하여 XML Document에 적용하고 출력물을 파일에 쓰고 싶습니다.

여기서 가능한 답을 찾았습니다. http://web.archive.org/web/20130329123237/http ://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

기사의 내용:

XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslTransform myXslTrans = new XslTransform() ;
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null) ;
myXslTrans.Transform(myXPathDoc,null,myWriter) ;

편집:

하지만 내 믿음직한 컴파일러가 말하길XslTransformis old: UseXslCompiledTransform대신:

XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null);
myXslTrans.Transform(myXPathDoc,null,myWriter);

Daren의 훌륭한 답변을 바탕으로, 이 코드는 적절한 XslCompiled Transform을 사용함으로써 크게 단축될 수 있습니다.오버로드 변환:

var myXslTrans = new XslCompiledTransform(); 
myXslTrans.Load("stylesheet.xsl"); 
myXslTrans.Transform("source.xml", "result.html"); 

(이것을 답으로 제시해서 미안하지만,code block댓글에 대한 지원은 다소 제한적입니다.)

VB.NET에서는 다음과 같은 변수도 필요 없습니다.

With New XslCompiledTransform()
    .Load("stylesheet.xsl")
    .Transform("source.xml", "result.html")
End With

MSDN의 C#에서 XSL 변환을 수행하는 방법에 대한 자습서는 다음과 같습니다.

http://support.microsoft.com/kb/307322/en-us/

파일을 작성하는 방법은 다음과 같습니다.

http://support.microsoft.com/kb/816149/en-us

참고 사항: 검증 작업도 함께 수행하려면 여기에 다른 튜토리얼이 있습니다(DTD, XDR 및 XSD(= schema)).

http://support.microsoft.com/kb/307379/en-us/

좀 더 많은 정보를 제공하기 위해서 추가한 것입니다.

이것이 당신에게 도움이 될 것입니다.

public static string TransformDocument(string doc, string stylesheetPath)
{
    Func<string,XmlDocument> GetXmlDocument = (xmlContent) =>
     {
         XmlDocument xmlDocument = new XmlDocument();
         xmlDocument.LoadXml(xmlContent);
         return xmlDocument;
     };

    try
    {
        var document = GetXmlDocument(doc);
        var style = GetXmlDocument(File.ReadAllText(stylesheetPath));

        System.Xml.Xsl.XslCompiledTransform transform = new System.Xml.Xsl.XslCompiledTransform();
        transform.Load(style); // compiled stylesheet
        System.IO.StringWriter writer = new System.IO.StringWriter();
        XmlReader xmlReadB = new XmlTextReader(new StringReader(document.DocumentElement.OuterXml));
        transform.Transform(xmlReadB, null, writer);
        return writer.ToString();
    }
    catch (Exception ex)
    {
        throw ex;
    }

}   

데이터베이스에서 읽고 XSLT를 사용하여 변환하는 이 작은 코드 조각을 공유하고자 합니다.위에 저도 써본 적이 있습니다.xslt-extensions다른 사람들과 별 차이가 없는 거죠

참고: 이것은 단지 초안 코드일 뿐이며, 생산에 사용하기 에 정리가 필요할 수 있습니다.

var schema = XDocument.Load(XsltPath);
using (var connection = new SqlConnection(ConnectionString))
{
    connection.Open();
    using (var command = new SqlCommand(Sql, connection))
    {
        var reader = command.ExecuteReader();
        var dt = new DataTable(SourceNode);
        dt.Load(reader);
                    
        string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + Environment.NewLine;
        using (var stringWriter = new StringWriter())
        {
            dt.WriteXml(stringWriter, true);
            xml += stringWriter.GetStringBuilder().ToString();
        }

        XDocument transformedXml = new XDocument();
        var xsltArgumentList = new XsltArgumentList();
        xsltArgumentList.AddExtensionObject("urn:xslt-extensions", new XsltExtensions());

        using (XmlWriter writer = transformedXml.CreateWriter())
        {
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(schema.CreateReader());
            xslt.Transform(XmlReader.Create(new StringReader(xml)), xsltArgumentList, writer);
        }
        var result = transformedXml.ToString();
    }
}

XsltPath는 xslt 파일의 경로입니다.
ConnectionStringconstant가 데이터베이스를 가리키고 있습니다.
Sql당신의 질문입니다.
SourceNode소스 xml의 각 레코드의 노드입니다.

흥미로운 부분은 다음의 사용법을 주목해 주시기 바랍니다.urn:xslt-extensions그리고.new XsltExtensions()위와 같은 암호로xslt에서는 불가능할 수도 있는 복잡한 계산이 필요하다면 이것을 사용할 수 있습니다.다음은 날짜 형식을 지정하는 간단한 방법입니다.

public class XsltExtensions
{
    public string FormatDate(string dateString, string format)
    {
        DateTime date;

        if (DateTime.TryParse(dateString, out date))
            return date.ToString(format);

        return dateString;
    }
}

XSLT 파일에서는 아래와 같이 사용할 수 있습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:xslt-extensions">
...
<myTag><xsl:value-of select="ext:FormatDate(record_date, 'yyyy-MM-dd')"/></myTag>
...
</xsl:stylesheet>

언급URL : https://stackoverflow.com/questions/34093/how-to-apply-an-xslt-stylesheet-in-c-sharp

반응형