代码之家  ›  专栏  ›  技术社区  ›  Damovisa

如何使用xslt将xml转换为无效的xml?

  •  4
  • Damovisa  · 技术社区  · 15 年前

    我需要将有效的XML文档转换为 OFX v1.0.2 format . 这种格式或多或少是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;
    }
    

    如果我使用 &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文档。显然它不会解析。道歉。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Marc Gravell    15 年前

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