2010-03-23 7 views
3

유효한 XML 문서를 OFX v1.0.2 format으로 변환해야합니다. 이 형식은 다소 XML이지만, 기술적으로 유효하지 않으므로 XML로 파싱 할 수 없습니다.XSLT를 사용하여 XML을 잘못된 XML로 변환하려면 어떻게해야합니까?

.NET XslCompiledTransform 개체가 XML 문서로 출력을 해석하려고하기 때문에 XML 변환이 제대로 작동하지 않습니다.

는 ** 저는 여기에 파일을 다운로드 할 때 내가 <, 그들은 제거 얻을 &gt를 사용하여 XML 틱 태그를 벗어날 경우는 XML을

public string Transform(XmlElement xmlElement, Dictionary<string, object> parameters) 
{ 
    string strReturn = ""; 

    // Set the settings to allow scripts to executed. 
    XsltSettings settings = new XsltSettings(false, true); 

    // Load the XSLT Document 
    XslCompiledTransform xslt = new XslCompiledTransform(); 

    xslt.Load(xsltFileName, settings, new XmlUrlResolver()); 

    // arguments 
    XsltArgumentList args = new XsltArgumentList(); 
    if (parameters != null && parameters.Count > 0) 
    { 
     foreach (string key in parameters.Keys) 
     { 
      args.AddParam(key, "", parameters[key]); 
     } 
    } 

    //Create a memory stream to write to 
    Stream objStream = new MemoryStream(); 

    // Transform the xml/xslt into a Writer 
    XmlTextWriter xmlWriter = new XmlTextWriter(objStream, Encoding.UTF8); 

    // Apply the transform 
    xslt.Transform(xmlElement, args, xmlWriter); 

    objStream.Seek(0, SeekOrigin.Begin); 

    // Read the contents of the stream 
    StreamReader objSR = new StreamReader(objStream); 

    strReturn = objSR.ReadToEnd(); 

    return strReturn; 
} 

를 변환하는 제 기능입니다.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"></xsl:output> 
    <xsl:param name="currentdate"></xsl:param> 
    <xsl:template match="Transactions"> 
OFXHEADER:100 
DATA:OFXSGML 
VERSION:102 
SECURITY:NONE 
ENCODING:USASCII 
CHARSET:1252 
COMPRESSION:NONE 
OLDFILEUID:NONE 
NEWFILEUID:NONE 
<OFX> 
    <SIGNONMSGSRSV1> 
     <SONRS> 
      <STATUS> 
       <CODE>0 
       <SEVERITY>INFO 
      </STATUS> 
      <DTSERVER><xsl:value-of select="$currentdate" /> 
      <LANGUAGE>ENG 

그래서 내가 일반 텍스트 문자열로 내 XML을 변환 할 수 있습니다 :

여기 내 XSLT의 시작인가?

는 UPDATE :

이 질문을 변경했습니다. 나는 원래 질문에 대한 분명한 대답을 깨달았다. XslCompiledTransform 개체를 사용하려면 XmlTextWriter를 사용하여 XML 문서에 출력을 작성해야합니다. 분명히 구문 분석하지 않습니다. 사과.

+0

당신은 문제가 무엇인지 정확하게 말의 더 나은 일을해야한다. 특히 문제를 재현하는 작은 예제를 만들 수 있습니까? –

+0

@ 존 - 예외와 일부 코드를 포함하도록 질문을 업데이트하겠습니다. – Damovisa

답변

2

Xslt가 텍스트를 출력 할 수 있습니다. xslt의 출력 모드를 텍스트로 설정하고 wriet을 TextWriter (사용 가능한 다중 오버로드가 있음)으로 설정했는지 확인하십시오. 인 xsclt에 거의 xml을 쓰는 것은 힘들지 만 이스케이프 규칙을 비활성화하면 가능합니다.

여기에 비 XML을 작성하기위한 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" 
> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:call-template name="startElement"> 
     <xsl:with-param name="name" select="'SONRS'"/> 
     </xsl:call-template>   
     <xsl:call-template name="startElement"> 
     <xsl:with-param name="name" select="'STATUS'"/> 
     <xsl:with-param name="value" select="0"/> 
     </xsl:call-template> 
     <xsl:call-template name="startElement"> 
     <xsl:with-param name="name" select="'SEVERITY'"/> 
     <xsl:with-param name="value" select="'INFO'"/> 
     </xsl:call-template> 
     <xsl:call-template name="endElement"> 
     <xsl:with-param name="name" select="'SONRS'"/> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="startElement"> 
    <xsl:param name="name"/> 
    <xsl:param name="value"/> 
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text> 
    <xsl:value-of select="$name"/> 
    <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
    <xsl:value-of select="$value"/> 
    </xsl:template> 
    <xsl:template name="endElement"> 
    <xsl:param name="name"/> 
    <xsl:text disable-output-escaping="yes">&lt;/</xsl:text> 
    <xsl:value-of select="$name"/> 
    <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Marc에게 고마워요. 제가 해결할 때 XmlWriter를 사용하여 직렬화 할 때 답이 오히려 분명 해졌습니다. :) – Damovisa

+0

Marc. 그것은 결국 xslt의 한 지옥이 될 것입니다! 나는 stringbuilder를 사용하여이 모든 작업을 수행하는 동안 가치가 있다고 생각합니다. – Damovisa

+0

@Damovisa - 더 쉬울 수도 있습니다. 'XmlWriter'와'WriteRaw'를 사용할 수도 있습니다. –

관련 문제