【发布时间】:2013-07-08 21:33:14
【问题描述】:
我有一个包含 805 个模板的大型 XSLT 文件,根据系统和环境,该文件会因堆栈溢出而失败。
开发环境为 Windows 7、InfoPath 2010 和 C#。虽然安装了 .NET 4.0,但此版本的 InfoPath 使用 .NET 2.0。
正在使用的例程是:
private void TransformXML(String inputFileName, String transformFileName, String outputFileName)
{
CorralLog(String.Concat("Transform with ", transformFileName, ": ", inputFileName, " -> ", outputFileName));
using (XmlReader inputFile = XmlReader.Create(inputFileName, null))
{
XslCompiledTransform transform = new XslCompiledTransform(true);
XsltSettings settings = new XsltSettings(true, false);
transform.Load(transformFileName, settings, null);
using(XmlWriter outputFile = XmlWriter.Create(outputFileName))
{
filesToDelete.Add(outputFileName);
transform.Transform(inputFile, outputFile);
}
}
}
我可以看到一些可能性:
- 增加“transform.Load”命令可用的内存
- 用更多内存启动一个单独的线程
- 启动一个单独的线程并使用“msxsl.exe”执行转换(始终有效)
- 将 XSLT 文件拆分成更小的部分并多次进行转换
有人对选择哪个选项有建议吗?或者有什么其他建议?
保罗
有问题的 XLST 文件从 XML 文件中获取一些元素,更改一些元素的名称,然后生成另一个 XML 文件。大约有 800 个元素,每个元素都有自己的模板。
这段代码显示了 XSLT 文件开头的三个模板和两个用于复制元素的模板:一个用于按原样复制元素,另一个用于更改元素的名称。所有后续模板都以这两种方式之一进行格式化。
是这个语法导致了递归,还是模板的数量导致了堆栈溢出。 (通过在新线程中运行此转换,我们已经避免了这个问题,但可能没有解决它。)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-03-16T10:53:27">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/SAN/ClientProfiles/ClientProfile">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/SAN/ClientProfiles/ClientProfile/Name">
<CompanyName>
<xsl:apply-templates/>
</CompanyName>
</xsl:template>
【问题讨论】:
-
大量信息丢失。在什么特定条件下会失败?你自己有没有尝试过任何东西(如果没有,为什么不)?如果你给它足够的内存(比如 12GB),它总是能成功运行吗?根据目前提供的信息,任何答案都将是疯狂的猜测。
-
不知道您为什么说“多次转换”与“将 XSLT 文件拆分成更小的部分”相一致。是多阶段转型吗?
-
我们已经进行了五次转换,因为每一次转换的工作类型不同。因此,将大的变小可能会有所帮助,在不止一次变换中进行。但我们似乎已经成功地将转换扔到一个单独的线程中。