【问题标题】:How can I transform XML to invalid XML using XSLT?如何使用 XSLT 将 XML 转换为无效的 XML?
【发布时间】:2011-01-30 16:02:06
【问题描述】:

我需要将一个有效的 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;
}

如果我使用&amp;lt;&amp;gt 转义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 对象需要我使用XmlTextWriter 将输出写入Xml 文档。显然它不会解析。道歉。

【问题讨论】:

  • 您应该更好地说明问题究竟出在哪里。特别是,你能创建一个重现问题的小例子吗?
  • @John - 我将更新问题以包含异常和一些代码。

标签: c# .net xml xslt ofx


【解决方案1】:

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>

【讨论】:

  • 谢谢 Marc - 当我发现我正在使用 XmlWriter 对其进行序列化时,答案变得相当明显...... :)
  • 感谢您的更新,Marc。那将最终成为一个地狱般的xslt!我在想,用一个字符串生成器来做这一切可能是值得的……
  • @Damovisa - 这可能更容易。请注意,您也可以使用XmlWriterWriteRaw
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2019-04-11
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多