我正在创建一个XML文件,我使用c ++中的XSL转换将其转换为HTML。变换的输出方法是html。我试图以十六进制格式输出unicode字符。例如,我想将“&#x00cd”输出到XML文件。如果我使用
XmlDocument ^doc = gcnew XmlDocument();
doc->Load("XmlFile.xml");
XmlNode^ currNode = doc->DocumentElement->FirstChild;
currNode = currNode->NextSibling;
currNode->InnerText = L"Í";
然后输出XML使用默认设置
XmlWriter^ writer = XmlWriter::Create("XmlFileOut.xml", settings);
doc->Save(writer);
看起来像
<node>&#x00CD;</node>
然后当我执行xml到html转换时,而不是我想要的字体,我得到
<p>Your symbol is (<span style="font-family:MyFont">&#x00CD;</span>)</p>
当然,它在浏览器中显示为
You symbol is Í
如果我使用
currNode->InnerXML = L"Í";
然后输出xml包含实际字符
<node>Í</node>
并且生成的HTML也可以正常
<p>Your symbol is (<span style="font-family:MyFont">Í</span>)</p>
在浏览器中生成正确的字符符号。
但是,我希望XML输出和HTML输出使用十六进制unicode值
Í
而不是实际的字符'Í'
<node>Í</node>
表示XML和
<p>Your symbol is (<span style="font-family:MyFont">Í</span>)</p>
用于HTML,以便我可以更轻松地使用XSL转换从生成的HTML创建RTF文件。 (我需要HTML和RTF。)
我知道这一定很简单,但我已经把这张照片搞砸了。
答案 0 :(得分:2)
你的前提看起来很糟糕。让HTML使用十六进制数字字符引用来引用字符不会对编写XSLT转换以便从(X)HTML生成RTF文件的容易性产生一点点不同:存在于字符之间的字符之间的区别以'文字形式'输入(如果我们可以称之为),并且在XSLT使用的数据模型中看不到凭借数字字符引用而出现的字符。
如果您使用sed或其他非XML感知工具或使用数据模型的XML工具创建RTF,其中a
和a
之间的差异和{ {1}}是可见的(我不知道,但这些工具是可以想象的),那么你最好的选择是指定US-ASCII的输出编码,这将导致XSLT处理器使用数字字符引用所有非ASCII字符。我使用的XSLT处理器默认情况下似乎更喜欢十进制到十六进制的NCR,这可能很乏味;你可能有更好的运气,或者你可能会发现你可以写你的sed来使用十进制NCR。
如果您决定写出一个十六进制数字引用来到地狱或高水位,您将需要阅读'disable-output-escaping'。我不会在这里描述如何使用它,部分是因为我没有必要认真使用它,部分是因为(如上所述)我认为它实际上不会帮助你做你真正想做的事情
答案 1 :(得分:0)
假设你想使用XSLT创建带有XslCompiledTransform的HTML,其中任何非ASCII字符作为字符引用进行转义,然后使用<xsl:output method="html" indent="yes" encoding="us-ascii"/>
,那样就是你的样本
<p>
Your symbol is (<span style="font-family:MyFont">Í</span>)
</p>
被序列化为
<p>
Your symbol is (<span style="font-family:MyFont">Í</span>)
</p>
使用XslCompiledTransform和C#作为
XslCompiledTransform proc = new XslCompiledTransform();
proc.Load("XSLTFile1.xslt");
proc.Transform("XMLFile1.xml", "Result1.html");
您必须将其转码为C ++ / CLI,但方法应该清楚。