Wie kann ich XML mit XSLT in ungültige XML verwandeln?
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 <
und >
, 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.
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"><</xsl:text>
<xsl:value-of select="$name"/>
<xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:value-of select="$value"/>
</xsl:template>
<xsl:template name="endElement">
<xsl:param name="name"/>
<xsl:text disable-output-escaping="yes"></</xsl:text>
<xsl:value-of select="$name"/>
<xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:template>
</xsl:stylesheet>