好的,我无法使disable-output-escaping属性起作用。 这是我最小的例子:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<
<xsl:text><</xsl:text>
<xsl:text disable-output-escaping="yes "><</xsl:text>
<xsl:variable name="break" select="'<'"/>
<xsl:copy-of select="$break"/>
<xsl:value-of select="$break" disable-output-escaping="yes"/>
<xsl:value-of select="$break" disable-output-escaping="no"/>
</xsl:template>
</xsl:stylesheet>
我在C#应用程序中使用.Net处理器:
static void RunXslt(string xml)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
XslTransform myXslTransform = new XslTransform();
XmlTextWriter writer = new XmlTextWriter("C:\\output", null);
Stream xsltStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("myProject.mytransform.xslt");
XmlReader xsltReader = XmlReader.Create(xsltStream);
myXslTransform.Load(xsltReader);
myXslTransform.Transform(xmlDocument, null, writer);
writer.Flush();
writer.Close();
}
我得到的只是&amp; lt;而不是&lt;
我在这里做错了什么?
答案 0 :(得分:2)
我怀疑因为你使用XmlWriter作为目标,所以序列化(因此转义)是由XmlWriter完成的,而不是由转换引擎完成的,并且XmlWriter不知道disable-output-escaping。 (这就是d-o-e被弃用的原因......)
我不太了解.net处理器,但可能有某种方式将输出发送到字节流,以便转换引擎负责序列化和转义。
答案 1 :(得分:0)
我有同样的问题,因为我收到各种不同的XML文件(从伟大的设计到不那么好),并且由于.NET不支持开箱即用的XSLT 2.0,我决定购买图书馆。
有两种可供选择:Altova XML和Saxon。
我认为微软没有计划在c#中支持XSLT2.0,所以如果你想使用XSLT 2.0(或3.0),你必须投资两个库中的一个,或者建立你自己的 - 我不会推荐。