在XSL上使用特殊字符的XSLTCompiledTransform?

时间:2014-05-23 15:23:07

标签: c# .net xslt

我正在尝试使用以下方法转换XML:

    private string transformXML(string xml_data, string xml_style)
    {
        //generemos un html temporal para mostrar la transformacion
        string outfile = Path.GetTempFileName().Replace(".tmp", ".html");

        XslCompiledTransform proc = new XslCompiledTransform();

        using (System.IO.StringReader sr = new System.IO.StringReader(xml_style))
        {
            using (XmlReader xr = XmlReader.Create(sr))
            {
                proc.Load(xr);
            }
        }

        string resultXML;

        using (System.IO.StringReader sr = new System.IO.StringReader(xml_data))
        {
            using (XmlReader xr = XmlReader.Create(sr))
            {
                using (System.IO.StringWriter sw = new System.IO.StringWriter())
                {
                    proc.Transform(xr, null, sw);
                    resultXML = sw.ToString();
                    System.IO.File.WriteAllText(outfile, resultXML);

                    return outfile;
                }
            }
        }
    }

使用此功能,由于非法System.Xml.Xsl.XslLoadException,我在porc.Load(xr)行上显示'<'。此行<中的非法字符:

<xsl:when test="$value &lt; 19">

正如你所见,逃脱了。可能,Xml.Create()无法解决我的&lt;,这是怎么回事?

1 个答案:

答案 0 :(得分:1)

恭敬地:我建议这可能与您方法的调用者中的编码/解码问题有关 - &gt;在从源代码中加载XSL的方式/在将其传递到&#34; transformXML&#34;之前方法

为了回顾我对此的看法,我做了以下几点:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Xsl;

namespace XSLPlayPlace
{
    class Program
    {
        static void Main(string[] args)
        {
            string stylesheetText = File.ReadAllText("stylesheet.xsl");

            var program =
                new Program().transformXML("<data><item>1</item><item>2</item><item>19</item><item>1</item></data>", stylesheetText);
        }

        private string transformXML(string xml_data, string xml_style)
        {
            [... snip ... your code copied exactly as per the question ...]
        }
    }
}

并在控制台应用中添加了一个文件,将其设置为“始终复制”。其中文件内容如下(随机XSL涂鸦只是为了在XSL节点周围获得语法,你有疑问):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template name="test" match="//data/item">
    <xsl:variable name="value" select=". + 1"/>
    <xsl:choose>
      <xsl:when test="$value &lt; 19">
      </xsl:when>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

我很高兴这种情况不正确并且没有点击任何节点或返回任何值...但它所表明的是XSL编译正常。

如果调试代码,请非常小心调试器如何显示您传入的XSL - &gt;使用上下文菜单中的文字可视化工具&#39;在QuickWatch中也许?可能会解决问题。