我正在尝试使用以下方法转换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 < 19">
正如你所见,逃脱了。可能,Xml.Create()无法解决我的&lt;,这是怎么回事?
答案 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 < 19">
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我很高兴这种情况不正确并且没有点击任何节点或返回任何值...但它所表明的是XSL编译正常。
如果调试代码,请非常小心调试器如何显示您传入的XSL - &gt;使用上下文菜单中的文字可视化工具&#39;在QuickWatch中也许?可能会解决问题。