在 transformig 时更改 xslCompiledTransform 输出编码

Posted

技术标签:

【中文标题】在 transformig 时更改 xslCompiledTransform 输出编码【英文标题】:Change xslCompiledTransform output encoding while transformig 【发布时间】:2020-01-05 16:57:33 【问题描述】:

我正在使用 xslCompiledTransform 将我的 XML 转换为 XSLT,当它转换时,它会更改输出结果编码,即 UTF-16(默认情况下) 当我尝试更改其或编码时,它会提示此属性是只读的错误,您无法更改它!

我也尝试了 xmlWriter 和 xmlWriterSettings 以及 memory Stream 和其他解决方案,但对我没有任何作用,为了参考我正在添加代码 sn-p

public static StringBuilder TransformXml(ProcessorConfigElement configSettings, StringBuilder xml, ILog logger)

//Perform transformation...
StringBuilder newXmlBuilder = new StringBuilder(xml.Length);
XslCompiledTransform requiredXslt = new XslCompiledTransform();
requiredXslt.Load(configSettings.XsltPath, XsltSettings.TrustedXslt, new XmlUrlResolver());

// I tried this trick also but all in vain 
// Encoding wind1252 = Encoding.GetEncoding(1252);
// XmlWriterSettings xmlSettings = new XmlWriterSettings();
// xmlSettings.Encoding = wind1252;
// xmlSettings.ConformanceLevel = ConformanceLevel.Fragment;
// xmlSettings.OmitXmlDeclaration = true;
// XmlWriter writer = XmlWriter.Create(newXmlBuilder, xmlSettings);

StringBuilder s = new StringBuilder();
using (TextWriter newXmlWriter = StringWriter.Create(newXmlBuilder))


if (!string.IsNullOrEmpty(configSettings.Delimiter))

XsltArgumentList argsList = new XsltArgumentList();
argsList.AddParam("delimiter", "", configSettings.Delimiter);
// here is the actual problem when it transforms its create a mess and converting pound symbol and other symbols as diamond special character (encoding issue.) 
requiredXslt.Transform(GetElement(xml.ToString()), argsList, newXmlWriter);


else

requiredXslt.Transform(GetElement(xml.ToString()), null, newXmlWriter);



logger.Info("XSLT applied successfully");

//replace string after transformation to validate and write to file
xml = newXmlBuilder;
return xml;

我想在将其转换为 XSLT 时使用所需的 UTF 编码,有人吗?

【问题讨论】:

目前尚不清楚您是否遇到 XslCompiledTransform 根据您的 XSLT 代码或您的期望在 XML 声明中输出错误编码的问题,或者您是否以某种方式使用了特定的编码,但后来当您尝试使用结果您可能没有正确的代码来读取具有该编码的输出。你在哪里有“混乱”,哪个代码或应用程序使用了 XSLT 转换的结果并错误地显示了结果? XSLT 是否输出带有编码信息的 XML 声明? 嗨,实际上问题是当 XslCompiledTransform 从给定的 xml 文件转换它时,井号会更改为特殊字符,而这个问题实际上是由于 XslCompiledTransform 输出设置的编码,因为我想要的编码是 Windows-1252 和 XslCompiledTransform 输出默认编码是 UTF-16 并且当文件转换时它会造成混乱,当我尝试更改 XslCompiledTransform 输出设置的默认编码时它不会让我这样做是因为它说该属性是只读 通过在 xsl out 标记处传递所需的 encoding 类型在我的 xslt 文件中的任何方式。如文档中所述,XslCompiledTransform 输出设置从 XSLT => xsl out 标记中选择编码,如果您不提供它,那么默认情况下它将是 UTF-16,因为它是 C# 内部默认编码字符串 【参考方案1】:

正如 Martin Honnen 已经指出的那样,如果 XSLT 已经具有输出声明,则如下所示:

XSLT

<xsl:output indent="yes" method="xml" encoding="utf-8"/>

这是通过 xslt.OutputSettings 参数从 XSLT 文件中提取的 c#:

c#

void Main()

    const string SOURCEXMLFILE = @"e:\Temp\UniversalShipment.xml";
    const string stylesheet = @"e:\Temp\UniversalShipment.xslt";
    const string OUTPUTXMLFILE = @"e:\temp\UniversalShipment_output.xml";
    bool paramXSLT = false;


    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load(stylesheet, XsltSettings.TrustedXslt, new XmlUrlResolver());

    // Load the file to transform.
    XPathDocument doc = new XPathDocument(SOURCEXMLFILE);

    XsltArgumentList xslArg = new XsltArgumentList();
    if (paramXSLT)
    
        // Create a parameter which represents the current date and time.
        DateTime d = DateTime.Now;
        xslArg.AddParam("date", "", d.ToString());
    

    using (XmlWriter writer = XmlWriter.Create(OUTPUTXMLFILE, xslt.OutputSettings))
    
        xslt.Transform(doc, xslArg, writer);
    

【讨论】:

以上是关于在 transformig 时更改 xslCompiledTransform 输出编码的主要内容,如果未能解决你的问题,请参考以下文章

在运行时更改方向更改 ViewControllers

在片段中在运行时更改方向时更改布局而不重新创建视图

在状态更改时更改按钮颜色

Oracle SQL 在字段更改时运行总计(仅在字段更改时对列求和)

为啥我的 AppBar MUI 样式组件在状态更改时不会更改样式?

更改布尔值时无法在 SwiftUI 中更改按钮文本