我想要阻止或处理我在写作中StackOverflowException对XslCompiledTransform.Transform方法的调用Xsl Editor.问题似乎是用户可以写一个Xsl script无限递归的东西,它只是在调用Transform方法时爆炸.(也就是说,问题不仅仅是典型的编程错误,这通常是造成这种异常的原因.)
有没有办法检测和/或限制允许的递归次数?或者任何其他想法,以防止这些代码炸毁我?
我正在尝试将参数传递给XSLT样式表,但是当使用XSlCompiledTransform转换文档时,我得到的是一个空的xml文档.
这是用于添加参数的C#方法(在添加人们的建议之后)
private static void CreateHierarchy(string manID)
{
string man_ID = manID;
XsltArgumentList argsList = new XsltArgumentList();
argsList.AddParam("Boss_ID","",man_ID);
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("htransform.xslt");
using (StreamWriter sw = new StreamWriter("output.xml"))
{
transform.Transform("LU AIB.xml", argsList, sw);
}
}
Run Code Online (Sandbox Code Playgroud)
这是样式表.我传入的参数是'Boss_ID'
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="OrgDoc">
<xsl:param name="Boss_ID"></xsl:param>
<xsl:processing-instruction name="xml-stylesheet">
<xsl:text>type="text/xsl" href="..\styles\orgcharts.xsl" </xsl:text>
</xsl:processing-instruction>
<OrgDoc>
<xsl:for-each select="PosDets[@OC_Man = $Boss_ID]">
<PosDets OC_Pos="{@OC_Pos}" OC_Sub="{@OC_Sub}" OC_Man="{@OC_Man}" OC_Ttl="{@OC_Ttl}" OC_Rnk="{@OC_Rnk}" OC_Bdg="{@OC_Bdg}" OC_Fnd="{@OC_Fnd}" OC_OL3="{@OC_OL3}" OC_Tmp="{@OC_Tmp}">
<xsl:apply-templates select="../PosDets">
<xsl:with-param name="mgrid" select="@OC_Pos"/>
</xsl:apply-templates>
</PosDets> …Run Code Online (Sandbox Code Playgroud) 我正在使用xslt将xml文件转换为html..net xslt引擎不断为空标签提供自动关闭标签.
例:
<div class="test"></div>
Run Code Online (Sandbox Code Playgroud)
变
<div class="test" />
Run Code Online (Sandbox Code Playgroud)
前者是有效的html,而后者是非法的HTML并且呈现得很糟糕.我的问题是:如何告诉xslt引擎(XslCompiledTransform)不使用自闭标签.
如果不可能,我怎么能告诉我的浏览器(在这种情况下是IE6 +)正确解释自动关闭标签.
我有一个字符串inputXMLString,第二个包含名为transformXSLString的变换XSL.它们都是正确格式化的xml.
如何在C#中使用XslCompiledTransform执行转换,以便将结果也作为字符串,让我们说resultXMLString?
我正在尝试将大型应用程序迁移XslTransform到已编译的xsl文件和XslCompiledTransform.
该应用程序使用Xsl创建HTML文件,并将转换数据(Xml)传递给Xsla XmlDataDocument,从数据库返回.
我现在改变所有这一切(至少暂时):
C#
public string ProcessCompiledXsl(XmlDataDocument xml)
{
StringBuilder stringControl = new StringBuilder();
XslCompiledTransform xslTran = new XslCompiledTransform();
xslTran.Load(
System.Reflection.Assembly.Load("CompiledXsl").GetType(dllName)
);
xslTran.Transform(xml, this.Arguments, XmlWriter.Create(stringControl, othersettings), null);
return stringControl.ToString();
}
Run Code Online (Sandbox Code Playgroud)
XSL(仅举例)
...
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="//Object/Table">
<a href="#">
some text
</a>
</xsl:for-each>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
问题
这是有效的,但xsl正在剥离输出的标签之间的空格:
<a href="#">
some text
</a><a href="#">
some text
</a><a href="#">
some text
</a><a...etc
Run Code Online (Sandbox Code Playgroud)
我试过了:
xml:space="preserve"但我无法让它工作OutputSettings,但我没有得到任何好结果(也许我错过了一些东西) …我的webapp(ASP.NET 2.0)在同一台机器上使用web服务(asmx on 1.1 framework).在获得XML之后,我将其传递给XslCompiledTransformXML以将其
转换为HTML并且工作正常.
昨天我System.IO.FileNotFoundException经常得到一个,不知道是什么原因造成这种问题.
首先看我认为这是关于c:\ windows\temp的读/写权限然后我确保给它网络服务的完全权限(也是最后的所有人-_-!),但它没有帮助.
任何想法或解决方案将不胜感激.
-------------------- stack trace --------------------------
Exception: **System.IO.FileNotFoundException**
**Could not find file 'C:\WINDOWS\TEMP\sivvt5f6.dll'.**
at System.IO.__Error**.WinIOError**(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32
rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
at Microsoft.CSharp.CSharpCodeGenerator.FromDomBatch(CompilerParameters options, CodeCompileUnit[] ea)
at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromDomBatch(CompilerParameters options, CodeCompileUnit[] ea)
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromDom(CompilerParameters options, …Run Code Online (Sandbox Code Playgroud) 在加载XslCompiledTransform时,我有一些大的xslt崩溃iis(StackOverflowException),而旧的(已弃用的)XslTransform工作正常.大模板是否存在一些已知问题?奇怪的是,相同的XslCompiledTransform在win32应用程序中成功加载.
XslTransform似乎已被Microsoft弃用,转而使用XslCompiledTransform.从理论上讲,如果我在执行应用程序期间只进行一次转换,那么解释XSLT(通过XslTransform)是否应该比编译它更快?如果是这样,XslTransform是否写得如此糟糕以至于对XslCompiledTransform所做的改进不仅仅是为了弥补它?
我正在使用一个XsltCompiledTransformXML将一些XML转换为HTML片段(不是一个完整的HTML文档,只是我将在其他地方生成的页面中包含的DIV).
我正在进行如下转换:
StringBuilder output = new StringBuilder();
XmlReader rawData = BusinessObject.GetXml();
XmlWriter transformedData = XmlWriter.Create(output);
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("stylesheet.xslt");
transform.Transform(rawData, transformedData);
Response.Write(output.ToString());
Run Code Online (Sandbox Code Playgroud)
我的问题是转换的结果总是从这个XML指令开始:
<?xml version="1.0" encoding="utf-16"?>
Run Code Online (Sandbox Code Playgroud)
如何防止这种情况出现在我的转化数据中?
编辑:
我告诉XSLT我不希望它输出一个xml声明
<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>
Run Code Online (Sandbox Code Playgroud)
但这似乎对我的输出中出现的指令没有影响.
有趣的是,我的XML数据源和我的XSLT转换都指定自己UTF-8不是UTF-16.
更新:
UTF-16似乎正在出现,因为我使用字符串(构建器)作为输出机制.当我将代码更改为使用MemoryStream而不是a时StringBuilder,我的UTF-8编码将被保留.我猜这与该string类型的内部工作方式以及它如何处理编码有关.
XSL noobie但是卡住了!
我有一个使用c#脚本函数格式化日期的转换,当我在VS 2008并运行"show xml output"时这很好用,输出正是我想要的.
但是,当我尝试使用代码运行时,我得到错误
未定义或导入预定义类型"System.Object"
要调用转换的函数看起来像这样,它在我开始使用脚本之前非常基础和工作
Run Code Online (Sandbox Code Playgroud)public static string RunXSLT(string xsltFile, string inputXML) { XslCompiledTransform transform = new XslCompiledTransform(); XsltSettings settings = new XsltSettings(); settings.EnableScript = true; transform.Load(xsltFile, settings, null); StringReader sReader = new StringReader(inputXML); XmlTextReader xmlTextReader = new XmlTextReader(sReader); //Create an XmlTextWriter which outputs to memory stream Stream stream = new MemoryStream(); XmlWriter xmlWriter = new XmlTextWriter(stream,> System.Text.Encoding.UTF8); transform.Transform(xmlTextReader, xmlWriter); stream.Position = 0; XmlDocument XmlDoc = new XmlDocument(); XmlDoc.Load(stream); return XmlDoc.OuterXml; }
XSL转换就是这个..
Run Code Online (Sandbox Code Playgroud)<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" …