Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用XSLT将XML转换为无效的XML?_C#_.net_Xml_Xslt_Ofx - Fatal编程技术网

C# 如何使用XSLT将XML转换为无效的XML?

C# 如何使用XSLT将XML转换为无效的XML?,c#,.net,xml,xslt,ofx,C#,.net,Xml,Xslt,Ofx,我需要将有效的XML文档转换为。这种格式或多或少是XML,但在技术上是无效的,因此不能解析为XML 由于.Netxslcomiledtransform对象坚持将输出解释为Xml文档(这是很公平的),因此我很难让Xml转换正常工作 **下面是我转换Xml的函数 public string Transform(XmlElement xmlElement, Dictionary<string, object> parameters) { string strReturn = "";

我需要将有效的XML文档转换为。这种格式或多或少是XML,但在技术上是无效的,因此不能解析为XML

由于.Net
xslcomiledtransform
对象坚持将输出解释为Xml文档(这是很公平的),因此我很难让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转换为纯文本字符串吗?

更新:

<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

我改变了这个问题。我刚刚意识到原来问题的明显答案。使用
xslcomiledtransform
对象需要使用XmlTextWriter将输出写入Xml文档。显然它不会解析。抱歉。

Xslt可以输出文本;只需确保将xslt的输出模式设置为text,并将write设置为
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>

/

您应该更好地说明问题的确切原因。特别是,你能创建一个重现问题的小例子吗?@John-我将更新问题,以包含异常和一些代码。谢谢Marc-当我发现我正在使用XmlWriter序列化它时,答案变得相当明显…:)谢谢你的更新,马克。这将最终成为一个地狱般的xslt!我想用一个stringbuilder做这一切可能是值得的…@Damovisa-可能会更容易。请注意,您还可以使用
XmlWriter
WriteRaw