.net 4 xslt 扩展对象

发布于 2024-09-13 21:41:23 字数 3069 浏览 2 评论 0原文

我正在升级 ASP.NET v3.5 Web 应用程序。到 v4,我在 XmlDataSource 对象上使用的 XSLT 转换遇到一些问题。

XSLT 文件的一部分:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ExtensionObject="ds:ExtensionObject"> 
  <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
  <xsl:template match="/Menus"> 
    <MenuItems> 
      <xsl:call-template name="MenuListing" /> 
    </MenuItems> 
  </xsl:template> 

  <xsl:template name="MenuListing"> 
    <xsl:apply-templates select="Menu" /> 
  </xsl:template> 

  <xsl:template match="Menu"> 
      <MenuItem> 
        <xsl:attribute name="Text"> 
          <xsl:value-of select="ExtensionObject:HtmlEncode(MenuTitle)"/> 
        </xsl:attribute> 
        <xsl:attribute name="ToolTip"> 
          <xsl:value-of select="MenuTitle"/> 
        </xsl:attribute> 
      </MenuItem> 
  </xsl:template> 
</xsl:stylesheet> 

这是初始化:

xmlDataSource.TransformArgumentList.AddExtensionObject("ds:ExtensionObject", new ExtensionObject()); 
xmlDataSource.Data = Cache.FetchPageMenu(); 

ExtensionObject:

public class ExtensionObject {
    public static string HtmlEncode(string input) {
        return "test";
    } 
}

我之前问过类似的问题:。 net 4 xslt 转换扩展功能损坏。对于不明确的调用,答案是正确的,但即使使用另一个正确的对象,它也无法工作。我没有收到任何错误,只是没有显示数据。

我也尝试过这个;

static void test() {
    // Create the XslCompiledTransform and load the stylesheet.
    XslCompiledTransform xslt = new XslCompiledTransform(true);
    xslt.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/transforms/menu.xslt"));

    // Create an XsltArgumentList.
    XsltArgumentList xslArg = new XsltArgumentList();
    xslArg.AddExtensionObject("ds:ExtensionObject", new ExtensionObject());

    using (XmlWriter w = XmlWriter.Create("output.xml")) {
        // Transform the file.
        xslt.Transform(Cache.FetchPageMenu(), xslArg, w);
    }
}

这在控制台应用程序中工作正常,但在 Web 应用程序中我得到一个安全异常,同样没有任何进一步的细节;

[安全异常:请求失败。]
System.RuntimeMethodHandle.PerformSecurityCheck(对象 obj、RuntimeMethodHandleInternal 方法,RuntimeType 父级,UInt32 调用标志)+0
System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags invokeAttr、Binder 绑定器,Object[] 参数, CultureInfo 文化,布尔值 跳过可见性检查)+323
System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags invokeAttr、Binder 绑定器,Object[] 参数, 文化信息文化)+38
System.Reflection.MethodBase.Invoke(对象 obj、Object[] 参数)+35
System.Xml.Xsl.XsltOld.FuncExtension.Invoke(XsltContext xsltContext,对象 [] 参数, XPathNavigator 文档上下文)+164
MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator 节点迭代器)+430

我正在完全信任地运行本地 asp.net v4 IIS7。

ExtensionObjects 可能存在什么问题。另外,为什么调试这个如此困难,有没有一个好的工具来调试带有扩展对象的xslt?

谢谢阿吉安..

I'm in the process of upgrading an asp.net v3.5 web app. to v4 and I'm facing some problems with XSLT transformations I use on XmlDataSource objects.

Part of a XSLT file:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ExtensionObject="ds:ExtensionObject"> 
  <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
  <xsl:template match="/Menus"> 
    <MenuItems> 
      <xsl:call-template name="MenuListing" /> 
    </MenuItems> 
  </xsl:template> 

  <xsl:template name="MenuListing"> 
    <xsl:apply-templates select="Menu" /> 
  </xsl:template> 

  <xsl:template match="Menu"> 
      <MenuItem> 
        <xsl:attribute name="Text"> 
          <xsl:value-of select="ExtensionObject:HtmlEncode(MenuTitle)"/> 
        </xsl:attribute> 
        <xsl:attribute name="ToolTip"> 
          <xsl:value-of select="MenuTitle"/> 
        </xsl:attribute> 
      </MenuItem> 
  </xsl:template> 
</xsl:stylesheet> 

And this is the initialization:

xmlDataSource.TransformArgumentList.AddExtensionObject("ds:ExtensionObject", new ExtensionObject()); 
xmlDataSource.Data = Cache.FetchPageMenu(); 

ExtensionObject:

public class ExtensionObject {
    public static string HtmlEncode(string input) {
        return "test";
    } 
}

I asked a similar question before: .net 4 xslt transformation Extension Function broken. The answer was right about the ambiguous call, but even with another correct object it just won't work. I'm not receiving any errors, just no data is displayed.

I've also tried this;

static void test() {
    // Create the XslCompiledTransform and load the stylesheet.
    XslCompiledTransform xslt = new XslCompiledTransform(true);
    xslt.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/transforms/menu.xslt"));

    // Create an XsltArgumentList.
    XsltArgumentList xslArg = new XsltArgumentList();
    xslArg.AddExtensionObject("ds:ExtensionObject", new ExtensionObject());

    using (XmlWriter w = XmlWriter.Create("output.xml")) {
        // Transform the file.
        xslt.Transform(Cache.FetchPageMenu(), xslArg, w);
    }
}

This works properly in a console application, but in a web application I get a securityexception, again without any further details;

[SecurityException: Request failed.]
System.RuntimeMethodHandle.PerformSecurityCheck(Object
obj, RuntimeMethodHandleInternal
method, RuntimeType parent, UInt32
invocationFlags) +0
System.Reflection.RuntimeMethodInfo.Invoke(Object
obj, BindingFlags invokeAttr, Binder
binder, Object[] parameters,
CultureInfo culture, Boolean
skipVisibilityChecks) +323
System.Reflection.RuntimeMethodInfo.Invoke(Object
obj, BindingFlags invokeAttr, Binder
binder, Object[] parameters,
CultureInfo culture) +38
System.Reflection.MethodBase.Invoke(Object
obj, Object[] parameters) +35
System.Xml.Xsl.XsltOld.FuncExtension.Invoke(XsltContext
xsltContext, Object[] args,
XPathNavigator docContext) +164
MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator
nodeIterator) +430

I'm running local asp.net v4 IIS7 with full trust.

What can be the problem with the ExtensionObjects. Also, why is it so difficult to debug this, is there a good tool to debug xslt with extension objects?

Thanks agian..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜宝宝 2024-09-20 21:41:23

几天后,我终于找到了解决方案......

它来自这篇文章: 渲染控件会在 .Net 4 中生成安全异常

为程序集设置 [程序集:SecurityRules(SecurityRuleSet.Level1)],并且它可以工作。

After some days I finally found the solution...

It came from this post: Rendering a control generates security exception in .Net 4

Set [assembly: SecurityRules(SecurityRuleSet.Level1)] for the assembly and it works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文