كيف يمكنني تحويل XML إلى XML غير صالح باستخدام XSLT؟
سؤال
أحتاج إلى تحويل مستند XML صالح إلى OFX V1.0.2 تنسيق. هذا التنسيق هو 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;
}
إذا هربت من علامات XML-ish باستخدام <
و >
, ، يتم إزالتها عند تنزيل الملف.
ها هي بداية 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 الخاص بي إلى سلسلة نصية عادي؟
تحديث:
لقد غيرت هذا السؤال. لقد أدركت للتو الإجابة الواضحة على السؤال الأصلي. باستخدام XslCompiledTransform
يتطلب الكائن مني كتابة الإخراج إلى مستند XML باستخدام XMLTextWriter. من الواضح أنها لن تتحلل. اعتذارات.
المحلول
يمكن XSLT إخراج النص ؛ فقط تأكد من تعيين وضع إخراج XSLT على النص ، و wriet إلى أ 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"><</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>