2017-11-13 19 views
0

saxon 9.8을 사용하고 있습니다. 나는 나에게이 기능을 채우기 도와주세요Saxon-api를 사용하여 변환하는 방법

`using Saxon.Api; 
    private string Transform(Stream xmlStream, string transform) 
    { 

    }` 

이 below.So 같은 C#에서 변환 함수를 작성 할

+0

정확하게 수행해야하는 기능은 무엇입니까? 문자열'transform'에서 XSLT로 입력'xmlStream'을 변환하고 싶다면 왜 결과가'XmlReader'입니까? XmlReader는 변환에 대한 입력으로 사용할 수 있습니다. –

+1

saxon-resources 파일을 다운로드하고이 API를 사용하는 샘플 응용 프로그램을 확인하십시오. –

+0

@Martin Honen, 반환 XmlReader 내 응용 프로그램에 대해 원하는 것입니다. 괜찮아. 반환 문자열을 작동하지만 수동 transformer.SetInputStream (스트림 입력, Uri의 baseUri)에 baseUri을 설정하고있다; 나는 이것이 무엇인지 전혀 모른다. 우리는 무엇을 설정합니까? – swifty

답변

0

난 당신이 적어도 자신의 코드를 작성하려고한다고 생각하면 때 인터넷에 가능한 대답을 찾으십시오. 그리고 특정한 질문을하는 것보다 당신이 이런 방식으로 우리의 문제를 풀 수 없을 때. 나는 당신을위한 전체 코드를 작성하지 않을 것입니다. 하지만 난 내가 XSLT 변환을위한 색슨 API를 사용하고 어떻게 여기에 공유 할 수 있습니다 : 나는 너무 XSLT1.0을 지원하기 위해 내 변환 클래스의 스위치를 사용하고

public static String TransfromXMLWithXSLT2(String i_xmlData, String i_xsltCode) 
    { 
     Processor xsltProcessor = new Processor(); 
     DocumentBuilder documentBuilder = xsltProcessor.NewDocumentBuilder(); 
     documentBuilder.BaseUri = new Uri("file://"); 
     XdmNode xdmNode = documentBuilder.Build(new StringReader(i_xmlData)); 

     XsltCompiler xsltCompiler = xsltProcessor.NewXsltCompiler(); 
     XsltExecutable xsltExecutable = xsltCompiler.Compile(new StringReader(i_xsltCode)); 
     XsltTransformer xsltTransformer = xsltExecutable.Load(); 
     xsltTransformer.InitialContextNode = xdmNode; 

     using (StringWriter stringWriter = new StringWriter()) { 
      Serializer serializer = new Serializer(); 
      serializer.SetOutputWriter(stringWriter); 
      xsltTransformer.Run(serializer); 
      return stringWriter.ToString(); 
     } 
    } 

. 당신이 문자열은 단순히이 필요한 방법으로 코드를 변경 스트림/독자와 필요가없는 경우에 따라서

public static String TransfromXMLWithXSLT1(String i_xmlData, String i_xsltCode) 
    { 
     XslCompiledTransform xslt = new XslCompiledTransform(); 

     using (StringReader xsltStringReader = new StringReader(i_xsltCode)) { 
      using (XmlReader xsltXmlReader = XmlReader.Create(xsltStringReader)) { 
       xslt.Load(xsltXmlReader); 
       using (StringReader tableStringReader = new StringReader(i_xmlData)) { 
        using (XmlReader tableXmlReader = XmlReader.Create(tableStringReader)) { 
         using (StringWriter stringWriter = new StringWriter()) { 
          xslt.Transform(tableXmlReader, new XsltArgumentList(), stringWriter); 
          return stringWriter.ToString(); 
         } 
        } 
       } 
      } 
     } 
    } 

: XSLT1.0 동안 나는 내 코드에서 다음과 같습니다 당신의 정보를 원하시면, 닷넷 기능을 선호 !

+0

documentBuilder.BaseUri = new Uri ("file : /// C :/"); 에 대한? 의무적인가? 그게 필요 없다면? – swifty

+0

좋은 질문입니다! 그것은 필수적이지만 나는 정확히 왜 그런지 알지 못합니다. Saxon은 특히 파일을 처리하기 위해 만들어 졌기 때문에 그럴 것 같습니다. 일반적으로 DocumentBuilder는 시스템에 새 문서를 만듭니다. XsltTransformer 용 XdmNode를 생성하기 위해서만 사용하고 있습니다. 그러나 새로운 Uri ("file : //")를 수정하는 것으로 충분합니다. 다른 블로그에서 이것을 봤습니다 => https://stackoverflow.com/questions/16101213/load-xml-and-xslt-from-embedded-resource-in-saxon-9-4he – Momo

+1

https에서이 질문에 대한 토론이 있습니다. : //saxonica.plan.io/boards/3/topics/7029 –