C# 转换时更改xslCompiledTransform输出编码

C# 转换时更改xslCompiledTransform输出编码,c#,xml,xslt,encoding,C#,Xml,Xslt,Encoding,我使用xslCompiledTransform将XML转换为XSLT,当它转换时,它会更改输出结果编码,即UTF-16(默认情况下) 当我尝试更改其属性或编码时,它会提示错误,该属性为只读,您无法更改它 我也尝试了xmlWriter和xmlWriterSettings以及内存流和其他解决方案,但对我和我正在添加的代码片段的参考来说,没有任何效果 public static StringBuilder TransformXml(ProcessorConfigElement configSettin

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

我也尝试了xmlWriter和xmlWriterSettings以及内存流和其他解决方案,但对我和我正在添加的代码片段的参考来说,没有任何效果

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编码,有人吗?

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

XSLT


现在还不清楚您是否遇到了基于XSLT代码或您的期望在XML声明中输出错误编码的XslCompiledTransform问题,或者您是否以某种方式使用了特定编码,但稍后尝试使用结果时,您可能没有正确的代码来读取该编码的输出。哪里有“混乱”,哪个代码或应用程序使用XSLT转换的结果并错误地显示结果?XSLT是否输出带有编码信息的XML声明?您好,实际上,问题是当XslCompiledTransform从给定的xml文件转换它时,磅符号变为特殊字符,这个问题实际上是由于XslCompiledTransform输出设置的编码造成的,因为我想要的编码是Windows-1252,XslCompiledTransform输出默认编码是UTF-16,并且当文件转换会造成混乱,当我尝试更改XslCompiledTransform输出设置的默认编码时,它不允许我这样做,因为它说属性是只读的。我通过在xsl out标记处的xslt文件中传递所需的编码类型来理解它。如文档中所述,XslCompiledTransform输出设置从XSLT=>xsl out标记中选择编码,如果您不提供它,那么默认情况下它将是UTF-16,因为它是字符串的C#内部默认编码
<xsl:output indent="yes" method="xml" encoding="utf-8"/>
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);
    }
}