如何避免逃避“&”将XLST的XML输出到HTML时

时间:2016-08-23 18:01:28

标签: xml xslt

我正在创建一个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>&amp;#x00CD;</node>

然后当我执行xml到html转换时,而不是我想要的字体,我得到

<p>Your symbol is (<span style="font-family:MyFont">&amp;#x00CD;</span>)</p>

当然,它在浏览器中显示为

You symbol is &#x00CD;

如果我使用

currNode->InnerXML = L"&#x00CD;";

然后输出xml包含实际字符

<node>Í</node>

并且生成的HTML也可以正常

<p>Your symbol is (<span style="font-family:MyFont">Í</span>)</p>

在浏览器中生成正确的字符符号。

但是,我希望XML输出和HTML输出使用十六进制unicode值

&#x00CD;

而不是实际的字符'Í'

<node>&#x00CD;</node>

表示XML和

<p>Your symbol is (<span style="font-family:MyFont">&#x00CD;</span>)</p>

用于HTML,以便我可以更轻松地使用XSL转换从生成的HTML创建RTF文件。 (我需要HTML和RTF。)

我知道这一定很简单,但我已经把这张照片搞砸了。

2 个答案:

答案 0 :(得分:2)

你的前提看起来很糟糕。让HTML使用十六进制数字字符引用来引用字符不会对编写XSLT转换以便从(X)HTML生成RTF文件的容易性产生一点点不同:存在于字符之间的字符之间的区别以'文字形式'输入(如果我们可以称之为),并且在XSLT使用的数据模型中看不到凭借数字字符引用而出现的字符。

如果您使用sed或其他非XML感知工具或使用数据模型的XML工具创建RTF,其中a&#x0061;之间的差异和{ {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">&#xCD;</span>)
      </p>

使用XslCompiledTransform和C#作为

        XslCompiledTransform proc = new XslCompiledTransform();
        proc.Load("XSLTFile1.xslt");

        proc.Transform("XMLFile1.xml", "Result1.html");

您必须将其转码为C ++ / CLI,但方法应该清楚。