【问题标题】:Outputting 'SUB' character in CSV file when mapping from XML in XSLT map从 XSLT 映射中的 XML 映射时在 CSV 文件中输出“SUB”字符
【发布时间】:2019-11-06 00:41:22
【问题描述】:

我们的客户希望在 CSV 文件末尾添加一个“SUB”字符,以便接收方正确处理文件。

我收到了 Excel 文档,其中字符显示正确。我已将其包含在此处。

将其转换为 HEX 得到:1a

在我的 XSLT 代码中,我尝试使用 CSharp 脚本输出此字符:

public string OutputEndOfFileCharacterSUB()
{
     return '\u001A'.ToString();
}

但是当我构建和测试这个时,我得到一个错误:

XSLT 编译错误。 '',十六进制值 0x1A,无效 字符。

我的问题是如何在 XSLT 中正确输出这个字符?是不可能的,还是我应该使用不同的字符?

【问题讨论】:

  • 如果您的 XSLT 代码使用 XML 1.1,您可以将该字符插入/输出/包含为 ,请参阅 xsltfiddle.liberty-development.net/94rmq6U 其中 Saxon 9.8 HE .NET 和带有支持 XML 的 XML 解析器的 IKVM 平台使用 1.1 版。如果您使用 Microsoft XML API,那么您就没有 XML 1.1 支持。但是,您可以通过使用 XmlReader/WriterSettings 并将 CheckCharacters 设置为 false 来摆脱 。不确定这是否与 XslCompiledTransform 一起使用。

标签: c# xml csv xslt hex


【解决方案1】:

我认为你有两个选择,要么切换到支持 XML 版本 1.1 的解析器,其中在 XML 中允许使用像  这样的数字字符引用,并且你可以在 XSLT 代码中插入/输出这样的字符或使用漏洞利用Microsoft 已在其 XML API 中插入不支持 XML 1.1,但仍然允许使用 XmlReaderSettings/XmlWriterSettings 进行此类字符引用,其中属性 CheckCharacters 设置为 false。

后一个建议要求您加载 XSLT 样式表,在该样式表中使用适当的 XmlReaderSettings 字符引用,并使用相同的 XmlWriterSettings 写出样式表结果:

        XmlReaderSettings xrs = new XmlReaderSettings() { CheckCharacters = false };

        XslCompiledTransform xsltProc = new XslCompiledTransform();

        using (XmlReader xr = XmlReader.Create("sheet.xslt", xrs))
        {
            xsltProc.Load(xr);
        }

        XmlWriterSettings xws = xsltProc.OutputSettings.Clone();
        xws.CheckCharacters = false;

        using (XmlWriter xw = XmlWriter.Create("result.csv, xws))
        {
            xsltProc.Transform("input.xml", null, xw);
        }

在要输出字符的 XSLT 中,您可以使用字符引用 

第一个建议是可能的,例如切换到 Saxon 9 .NET,因为它带有 IKVM 和一个基于 Java 的交叉编译的 XML 解析器,可以处理 XML 版本 1.0 和 1.1。

【讨论】:

    【解决方案2】:

    您可以使用 System.BitConverter 将该十六进制输出转换为字符串。

    public string OutputEndOfFileCharacterSUB()
    {
         byte[] hexString = Encoding.ASCII.GetBytes('\u001A'.ToString());
         return System.BitConverter.ToString(hexString);
    }
    

    【讨论】:

    • 谢谢。当我在 Notepad++ 中打开它时,这会在我的输出 CSV 文件中打印出 1A。这会被解读为 SUB 字符吗?
    • 如果要显示为十六进制,可以在 1A 后加 0x,读取为 SUB 字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2021-04-12
    • 1970-01-01
    • 2018-01-19
    • 2014-10-13
    相关资源
    最近更新 更多