我在string
中有一个XML,我需要使用html
实际转换为xsl
。
我使用XslCompiledTransform
进行转换。为了实现这一点,我使用XPathDocument
解析包含XML到XML的字符串。
但是,如果我尝试将string
直接解析为XPathDocument
,那么我会收到错误:
路径中的非法字符。
所以我必须包含StringReader
才能将字符串解析为XPathDocument
。 (使用我在下面链接的帖子中的解决方案。)
这是我的一步一步程序:
从SDL Trados Studio检索string
,它取决于正在处理的XML(最初如何创建和加载翻译)string
有时会有{ {3}}有时不会。实际上,'xml'是从源文本和目标文本以及结构元素的片段中解析出来的。文本元素将转义为xml,标记和文本将合并为一个string
。 (关于删除BOM的单独帖子是BOM。)
然后使用string
将XPathDocument
解析为StringReader
。
使用XslCompiledTransform
和StringBuilder
StringWriter
完成转换。
已转换的xml(现在为html)已保存到文件中。
这是我的代码:
//Recreate XML file using an extractor returns a string array
string strSourceXML = String.Join("", extractor.TextSrc);
//strip BOM
strSourceXML = strSourceXML.Substring(strSourceXML.IndexOf("<?"));
//Transform XML with the preview XSL
var xSourceDoc = new XPathDocument(strSourceXML);
//Load XSL
var xTr = new XslCompiledTransform();
var xslt = Settings.GetValue("WordPreview", "XSLTpath", "");
xTr.Load(xslt);
//Parse XML string
dynamic xSourceDoc;
using (StringReader s = new StringReader(strSourceXML))
{
xSourceDoc = new XPathDocument(s);
}
//Transform the XML
StringBuilder sb1 = new StringBuilder();
StringWriter swSource = new StringWriter(sb1);
xTr.Transform(xSourceDoc, null, swSource);
//Transformed file saved to the disk
string tmpSourceDoc = Path.GetTempFileName();
System.IO.StreamWriter writer1 = new System.IO.StreamWriter(tmpSourceDoc, false, Encoding.Unicode);
writer1.Write(sb1.ToString());
writer1.Close();
我的问题是:有没有更简单的方法来解决它?有没有建议使用XSLT直接转换字符串?或者如果没有,是否有直接的方法将字符串解析为XPathDocument?
我搜索了Stack Overflow上的很多帖子,例如:
但他们都没有给我解决方案来做到这一点更简单。任何建议都是受欢迎的。感谢。
答案 0 :(得分:1)
不需要中级StringBuilder
和StringWriter
XsltCompiledTransform
实例可以立即写入磁盘上的流。
string strSourceXML = string.Concat(extractor.TextSrc);
strSourceXML = strSourceXML.Substring(strSourceXML.IndexOf("<?"));
var xTr = new XslCompiledTransform();
var xslt = Settings.GetValue("WordPreview", "XSLTpath", "");
xTr.Load(xslt);
string tmpSourceDoc = Path.GetTempFileName();
using (var reader = new StringReader(strSourceXML))
using (var writer = new StreamWriter(tmpSourceDoc, false, Encoding.Unicode))
{
var xSourceDoc = new XPathDocument(reader);
xTr.Transform(xSourceDoc, null, writer);
}