во время компиляции нежелательного сообщения было сгенерировано с помощью преобразования xslt в c # - PullRequest
1 голос
/ 08 февраля 2012

Привет, я генерирую шестнадцатеричный 01 и шестнадцатеричный 03 с помощью xslt и используя c # при преобразовании шестнадцатеричный 01 генерировал как пробел в текстовом документе, если я вижу в шестнадцатеричном формате, я мог видеть

ï »¿какой-то мусор генерируется перед гексом 01, обратите внимание, что эта проблема не копировалась для гекса 03, она работала хорошо, точно генерировал etx, как я мог решить эту проблему? Любая идея, пожалуйста ..

 <?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"               xmlns:myScripts="myScripts">
<xsl:output method="text" indent="yes"/>

<msxsl:script implements-prefix="myScripts" language="C#">
public string SOH()
{
  return '\u0001'.ToString();
}

  </msxsl:script>
 <msxsl:script implements-prefix="myScripts" language="C#">
   public string ETX()
{
  return '\u0003'.ToString();
}
</msxsl:script>

  <xsl:template match="/">
    <xsl:value-of select="myScripts:SOH()"></xsl:value-of>
    <xsl:value-of select="myScripts:ETX()"></xsl:value-of>
 </xsl:template>

</xsl:stylesheet>

вот мой код C # позади кода:

 XslCompiledTransform transform = new XslCompiledTransform(true);
                        transform.Load(strCTD, new XsltSettings() { EnableScript = true }, null); // Loading the given Xslt document
                        var writerSettigns = transform.OutputSettings.Clone();
                        writerSettigns.CheckCharacters = false;
       string strFileName = strpath + langid + strCSVFILE + strMsgType + strORGMSG +  strSeqNum + strNowDate + strHour + strMin + strSec + ".FTS";

                        try
                        {

                            MemoryStream memoryStream = new MemoryStream();
                            XmlWriterSettings xmlWriterSettings = new  XmlWriterSettings();
                            xmlWriterSettings.Encoding = new UTF8Encoding(false);
                            xmlWriterSettings.ConformanceLevel = ConformanceLevel.Document;
                            xmlWriterSettings.Indent = true;

                            using (XmlWriter writer = XmlWriter.Create(strFileName, writerSettigns)) 
                            {
                                transform.Transform("sampleCTD.xml", xmlArgsList, writer);
                            } 

                 string xmlString = Encoding.UTF8.GetString(memoryStream.ToArray());

               System.IO.StreamWriter file = new System.IO.StreamWriter(strFileName);
                            file.WriteLine(xmlString);

                            file.Close();
                      }
                      catch (Exception ex)
                       {
                     LogError(1, "Form1", "FileGenerationForCID",    ex.Message.ToString(), ex.StackTrace.ToString());
                        throw ex;
                    }

Я добавил некоторый код, чтобы избежать ошибки спецификации при запуске текста, даже если он не был решен, пожалуйста, кто-нибудь может посоветовать мне об этом в ближайшее время ....

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Используйте объект вместо вывода необработанного символа.Это принимает форму чего-то вроде &#1; или &#3;.

1 голос
/ 08 февраля 2012

То, что вы видите, - это UTF-8 BOM, Порядок следования байтов , который позволяет читателям, знающим UTF-8, правильно понимать кодировку.Возможно, измените объявление вывода на:

<xsl:output method="text" indent="yes" encoding="unicode"/>
0 голосов
/ 08 февраля 2012

И по другой теме - я не понимаю ваших пользовательских скриптовых методов. Мой первый инстинкт был: «Почему бы просто не использовать return "\u0001"; вместо того, чтобы ставить char и преобразовывать его в string, но когда я думаю об этом, вы можете перейти к использованию & # 0001, непосредственно встроенному в XML.

Либо используйте XML-объекты непосредственно в XSLT, например:

<xsl:value-of select="&#0001;"/>

или, если по какой-то причине вы не можете встроить сущности, упростите фрагменты кода без преобразования в строку;

public string SOH ()
{  
   return "\u0001";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...