2009-08-12 10 views
4

, 다음 코드를 작성하는 더 빠르고 간결한 방법이있다 : (! 지금까지 모든 해답을 주셔서 감사합니다)ASP.NET에서 XSLT 변환을 수행하는 가장 효율적인 방법은 무엇입니까? 즉

//Create an object for performing XSTL transformations 
XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load(HttpContext.Current.Server.MapPath("/xslt/" + xsltfile.Value), new XsltSettings(true, false), new XmlUrlResolver()); 

//Create a XmlReader object to read the XML we want to format 
//XmlReader needs an input stream (StringReader) 
StringReader sr = new StringReader(node.OuterXml); 
XmlReader xr = XmlReader.Create(sr); 

//Create a StringWriter object to capture the output from the XslCompiledTransform object 
StringWriter sw = new StringWriter(); 

//Perform the transformation 
xslt.Transform(xr, null, sw); 

//Retrieve the transformed XML from the StringWriter object 
string transformedXml = sw.ToString(); 

UPDATE : 내 모호성에 대한

죄송합니다 :에 의해 " 더 빨리 "그리고"간결하게 "내 말은, 나는 불필요한 단계를 포함합니까? 또한 다른 사람이 있다면 더 읽기 쉬운 솔루션을 좋아할 것입니다. 이 코드를 개발중인 웹 응용 프로그램의 작은 부분에서 사용하고 응용 프로그램의 상당 부분으로 이동하려고합니다. 그래서 이동하기 전에 깔끔하게 만들 수 있습니다. .

또한 데이터베이스와 통신하는 정적 클래스 (별도의 데이터 액세스 클래스 라이브러리에 있음)에서 XML을 가져옵니다. 또한 변환 된 XML 문자열을 웹 페이지로 전달하기 전에 조작합니다. 이 경우 입력/응답 스트림이 여전히 실행 가능한지 확실하지 않습니다.

한 가지 더 : XML과 XSLT가 변경 될 수 있습니다 (응용 프로그램 사용자가 두 가지 모두를 변경할 수 있음). 그래서 매번 컴파일해야 할 것입니다. 당신은 ASP.NET을 언급 이후

+0

위의 코드를 작성하는 데 더 읽기 쉬운 방법이있을 수 있지만 거기에는 필수 단계가 있습니다. 나는 당신이 "더 빠름"을 의미하는 것이 확실하지 않습니까? – Lee

+0

클라이언트 측에 표시되도록 XML을 변환하는 경우 asp : XML 컨트롤을 사용하지 않는 이유가 있습니까? 변형 된 문자열을 표시하는 것이 더 간단하지만 브라우저 사이드를 어떻게 사용하는지 모르겠습니다. http://msdn.microsoft.com/en-us/library/63cbk9e7(VS.85).aspx –

+0

@Jim asp : XML 컨트롤은 이전의 느린 XslTransform 클래스를 사용하므로 더 이상 사용되지 않습니다. http : //를 참조하십시오. 유용했던만큼 www.tkachenko.com/blog/archives/000513.html 수치심. –

답변

11

내가 당신과 매우 유사하다 내 ASP.NET, 위해 한 코드입니다 이런 코드를 다시 작성하는 것은 각 코드 블록이 하나의 목적을 가지고 있기 때문입니다. 이렇게하면 읽고 이해하기가 더 쉬워집니다. 또한 함수의 이름과 매개 변수에서 많은 정보를 유추 할 수 있기 때문에 코드의 주석이 덜 필요합니다.

+0

XmlReader 및 StreamReader를 삭제하지 않습니다. –

2

, 질문은 당신이있는 경우

7

... 당신이 당신의 변환 출력에 직접 응답 스트림을 사용하고 그것이 POST 인 경우 직접 입력 스트림을 사용할 수 있는지 여부를 수 있는지 여부입니다 대형 XSLT를 사용하면 프로젝트를 빌드 할 때 (예 : 빌드 후 단계) XSLT를 .NET 어셈블리로 컴파일하여 런타임에 컴파일하는 오버 헤드를 줄일 수 있습니다. 이 작업을 수행하는 컴파일러는 비주얼 스튜디오의 일부가 2008 년

미리 컴파일 된 XSLT 당신이 당신의 서버에 설치된 .NET 프레임 워크 나중에 2.0 SP1 이상이 필요합니다 (이 기능은 이러한 이었다로드하기 위해 xsltc.exe라고하고 있습니다 SP1 도입). 사전은 컴파일 XSLT 것은이되도록로드 후 캐싱XslCompiledTransform을 고려해야하는 옵션이없는 경우

XSLTC — Compile XSLT to .NET Assembly

: 예를 들어

안톤 Lapounov의 블로그 기사를 확인

변환을 실행할 때마다 컴파일 할 필요가 없습니다.

string path = HttpContext.Current.Server.MapPath("/xslt/" + xsltfile.Value); 
XmlReader reader = CreateXmlReader(node.OuterXml); 
string transformedXml = Transform(path, reader); 

private XmlReader CreateXmlReader(string text) 
{ 
    StringReader reader = new StringReader(text); 
    return XmlReader.Create(reader); 
} 

private string Transform(string xsltPath, XmlReader source) 
{ 
    XsltCompiledTransform transformer = new XsltCompiledTransform(); 
    transformer.Load(
     xsltPath, 
     new XsltSettings(true, false), 
     new XmlUrlResolver()); 

    StringWriter writer = new StringWriter(); 
    transformer.Transform(source, null, writer); 
    return writer.ToString(); 
} 

이유 왜 좋겠 :이 같은 코드를 다시 작성할 것

XDocument xDoc = XDocument.Load("output.xml"); 

     XDocument transformedDoc = new XDocument(); 
     using (XmlWriter writer = transformedDoc.CreateWriter()) 
     { 
      XslCompiledTransform transform = new XslCompiledTransform(); 
      transform.Load(XmlReader.Create(new StreamReader("books.xslt"))); 
      transform.Transform(xDoc.CreateReader(), writer); 
     } 

     // now just output transformedDoc 
0

: 여기

+0

-1을 사용하면 구문을 사용하지 않습니다. –

+0

@ John 내 코드에서 결정론적인 처리가 필요합니까? 디스크 파일로 작업하는 경우 XmlReader 생성과 관련하여 using 문을 배치하는 것을 이해할 수 있지만이 경우에는 가비지 수집기로 처리하는 것이 좋을 것 같지 않습니다. 읽기 쉽도록 – Lee

+0

+1; 당신의 도움을 주셔서 감사합니다. 필자는 웹 애플리케이션 전체에서 사용하고있는 몇 가지 공용 유틸리티가있는 별도의 "XMLHelper"클래스를 가지고 있습니다. 이 방법들은 거기에 아주 잘 통합 될 수 있습니다. – attack

2

는 전체 예제를 할 시간이 없지만, 몇 가지 메모 :

  1. XML은 선택 System.String와 동일하지 않습니다.클래스 라이브러리에서 XDocument 또는 XmlDocument로 가져옵니다. XDocument 또는 XmlDocument로 끝내십시오.
  2. ASP.NET Cache을 사용하면 .XSLT 파일이 변경 될 때의 캐시 종속성을 사용하여 컴파일 된 XSL을 저장할 수 있습니다.
  3. XML을 문자열로 변환 한 다음 다시 XML로 변환하지 마십시오. node.CreateNavigator().ReadSubTree()을 사용하십시오.
  4. 마찬가지로 XPathNavigator.AppendChild을 사용하여 XML 문서에 쓸 XmlWriter을 가져옵니다.
+0

팁 주셔서 감사하지만, 죄송합니다, 조금 혼란 스러워요. XML에서 문자열로 변환 한 다음이를 페이지에 직접 삽입합니다. 나는 다시 XML로 변환하지도 않고 XML을 변경하지도 않는다. 너는 내가 끈을 피해야한다고 말했다. 변형 된 XML을 웹 페이지에 직접 심어야 할 필요가 있다면 문자열로 변환하지 않고 XML을 처리 할 수있는 방법이 있을까요? – attack

+1

XML을 웹 페이지에 "심기"는 어떤 방식입니까? 대신,'XmlDocument.WriteTo (Response.OutputStream)'또는 동등 물을 사용하십시오. –

관련 문제