我生成了一个带有一些内联 c# 代码的 xsl 样式表。我需要在 IIS 上运行的 asmx 应用程序中使用它。这是样式表的摘录:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl in lang user" xmlns:in="http://www.composite.net/ns/transformation/input/1.0" xmlns:lang="http://www.composite.net/ns/localization/1.0" xmlns:f="http://www.composite.net/ns/function/1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
<xsl:output omit-xml-declaration="no" indent="yes" method="text"/>
<xsl:strip-space elements="*"/>
<msxsl:script language="C#" implements-prefix="user">
<msxsl:assembly name="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<msxsl:assembly name="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<msxsl:using namespace="System.Collections.Generic"/>
<msxsl:using namespace="System.Linq"/>
<msxsl:using namespace="System.Xml.Linq"/>
<![CDATA[
private static string GenerateLine(string what, int howmuch)
{
var unuseful_var = "";
return string.Concat(Enumerable.Repeat(what, howmuch).ToArray()).Substring(0, howmuch);
}
]]>
</msxsl:script>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="lines">
<xsl:for-each select="line">
<xsl:value-of select="user:GenerateLine("-", 10)" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在应用程序中,我以这种方式使用 xsl:
XslCompiledTransform transformer = new XslCompiledTransform();
...
transformer.Load(xsltReader, new XsltSettings() { EnableScript = true }, null);
transformer.Transform(xmlReader, null, outputStream);
...
在测试应用程序中一切正常,但是当我在 Web 应用程序中部署相同的代码和 xsl 样式表时,突然,xsl 转换引发了以下异常:
- 找不到类型或命名空间名称“var”(您是否缺少 using 指令或程序集引用?)
- “System.Collections.Generic.IEnumerable”不包含“ToArray”的定义
谷歌搜索我发现了这个(也许)相关的 SO 问题,但仍然没有答案。
我用一些变通方法解决了这些问题,但我绝对想知道木头下发生了什么。
谢谢