2010-03-23 56 views
3

我需要將有效的XML文檔轉換爲OFX v1.0.2 format。這種格式或多或少是XML,但它在技術上是無效的,因此不能被解析爲XML。如何使用XSLT將XML轉換爲無效的XML?

我無法讓我的Xml轉換工作,因爲.Net XslCompiledTransform對象堅持將輸出解釋爲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; 
} 

如果我逃使用&lt;&gt,他們得到刪除XML十歲上下的標籤時,我下載的文件。

這裏是我的XSLT的開始:

<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的純文本字符串?

UPDATE:

我已經改變了這個問題。我剛剛意識到原始問題的明顯答案。使用XslCompiledTransform對象需要我使用XmlTextWriter將輸出寫入Xml文檔。顯然它不會解析。道歉。

+0

你應該這樣做究竟說的是什麼問題的一個更好的工作。特別是,你能創建一個能夠重現問題的小例子嗎? – 2010-03-23 05:51:20

+0

@John - 我會更新問題以包含異常和一些代碼。 – Damovisa 2010-03-23 05:54:00

回答

2

Xslt可以輸出文字;只要確保將xslt的輸出模式設置爲文本,並將其設置爲TextWriter(有多個可用的重載)。寫一些差不多 xml在xslt是痛苦的,但可能禁用轉義規則。

下面是一個例子(雖然醜陋)XSLT編寫非XML:

<?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

謝謝馬克 - 當我解決問題時,我的答案變得相當明顯,我正在使用XmlWriter對其進行序列化... :) – Damovisa 2010-03-23 06:09:55

+0

感謝您的更新,馬克。這將最終成爲xslt的一個地獄! 我想這可能是值得的,而只是用stringbuilder來完成這一切... – Damovisa 2010-03-23 06:31:01

+0

@Damovisa - 它可能會更容易。請注意,您也可以使用'XmlWriter'和'WriteRaw' – 2010-03-23 06:59:51