XSLTを使用してXMLを無効なXMLに変換するにはどうすればよいですか?

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

  •  21-09-2019
  •  | 
  •  

質問

有効なXMLドキュメントをに変換する必要があります OFX V1.0.2形式. 。この形式は多かれ少なかれXMLですが、技術的に無効であるため、XMLとして解析することはできません。

.NETのためにXML変換を機能させるのに苦労しています 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 オブジェクトでは、XMLTextWriterを使用して出力をXMLドキュメントに書き込む必要があります。明らかにそれは解析しません。謝罪。

役に立ちましたか?

解決

XSLTはテキストを出力できます。 XSLTの出力モードをテキストに設定し、 TextWriter (複数の過負荷が利用可能です)。何かを書く ほぼ XSLTのXMLは苦痛ですが、エスケープルールを無効にすることで可能です。

以下は、非XMLを書くためのXSLTの例です。

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