كيف يمكنني تحويل XML إلى XML غير صالح باستخدام XSLT؟

StackOverflow https://stackoverflow.com/questions/2497827

  •  21-09-2019
  •  | 
  •  

سؤال

أحتاج إلى تحويل مستند 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 باستخدام &lt; و &gt, ، يتم إزالتها عند تنزيل الملف.

ها هي بداية 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">&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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top