Xslt未转义输出

时间:2014-09-24 10:00:14

标签: c# .net xslt

好的,我无法使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="/">
    &lt;
    <xsl:text>&lt;</xsl:text>
    <xsl:text disable-output-escaping="yes ">&lt;</xsl:text>
    <xsl:variable name="break" select="'&lt;'"/>
    <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;

我在这里做错了什么?

2 个答案:

答案 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),你必须投资两个库中的一个,或者建立你自己的 - 我不会推荐。