Frage

Ich muss ein gültiges XML -Dokument in die verwandeln OFX V1.0.2 Format. Dieses Format ist mehr oder weniger XML, aber technisch ungültig und kann daher nicht als XML analysiert werden.

Ich habe Probleme, meine XML -Transformation zum Laufen zu bringen, weil das .net XslCompiledTransform Objekt besteht darauf, die Ausgabe als XML -Dokument zu interpretieren (was fair genug ist).

** Hier ist meine Funktion, die XML zu transformieren

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;
}

Wenn ich den XML-ish-Tags entkomme, verwenden ich &lt; und &gt, Sie werden entfernt, wenn ich die Datei herunterlade.

Hier ist der Beginn meines 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

Kann ich meine XML in eine einfache Textzeichenfolge verwandeln?

AKTUALISIEREN:

Ich habe diese Frage geändert. Ich habe gerade die offensichtliche Antwort auf die ursprüngliche Frage erkannt. Verwendung der XslCompiledTransform Objekt erfordert, dass ich die Ausgabe mit einem XMLTextWriter in ein XML -Dokument schreiben muss. Offensichtlich wird es nicht analysieren. Entschuldigung.

War es hilfreich?

Lösung

XSLT kann Text ausgeben; Stellen Sie einfach sicher, dass Sie den Ausgangsmodus des XSLT auf Text festlegen und auf a wriet TextWriter (Es sind mehrere Überladungen verfügbar). Etwas schreiben, das ist fast XML in XSLT ist schmerzhaft, aber möglich, wenn Sie die Fluchtregeln deaktivieren.

Hier ist ein Beispiel (wenn auch hässlich) XSLT zum Schreiben von Nicht-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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top