-1

我们如何从 Xslt 中的静态类访问静态方法?静态类已在程序集中定义。

这是我要参考的静态类的定义

namespace Helper
{
    public static class StaticXsltHelper
    {
        public static double CalclutePerctange(int a, int b)
        {
            return b == 0 ? 0 : ((double)a * 100) / b;
        }
    }
}

我们如何StaticXsltHelper.CalclutePerctange在 Xslt 中引用方法?

对于非静态类和非静态方法,我可以使用以下语法

XslCompiledTransform t = new XslCompiledTransform();
XsltArgumentList l = new XsltArgumentList();
l.AddExtensionObject("a:b", new XsltHelper());
t.Load("XSLTFile.xslt", new XsltSettings(true, true), null);
using (StreamWriter w = new StreamWriter("XMLFileOut.xml"))
{
    t.Transform("XMLFile.xml", l, w);
}

这是 XsltHelper 类的定义

namespace Helper
{
    public class XsltHelper
    {
        public double CalclutePerctange(int a, int b)
        {
            return b == 0 ? 0 : ((double)a * 100) / b;
        }
    }
}

xslt 看起来像

  <xsl:stylesheet version="1.0" xmlns:prefix_1="http://www.w3.org/2001/XMLSchema-instance" xmlns:helper="a:b" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <xsl:for-each select="Entity">
      <Entity>
          <Percent>
            <xsl:value-of select="helper:CalclutePerctange(Value, Total)"/>
          </Percent>

但我没有找到任何关于静态方法的信息。

任何形式的帮助/评论将不胜感激。另外我想知道这是否可能。

4

1 回答 1

3

你想做这件事的主要原因是什么?

很可能没有办法为 XSLT 扩展对象使用静态类。

如果问题是方法已经在另一个程序集中定义,您无法修改如何在您可以修改的程序集中使用类似的东西:

public class XsltHelper
{
        public double CalculatePerctange(int a, int b)
        {
             return StaticXsltHelper.CalculatePercentage(a, b);            
        }
}

或者,如果您担心创建了太多对象,则可以使用单例:

namespace Helper
{
    public class XsltHelper
    {
        private XsltHelper();
        public readonly XsltHelper Instance = new XsltHelper();

        public double CalculatePerctange(int a, int b)
        {
            return b == 0 ? 0 : ((double)a * 100) / b;
        }
    }
}

然后使用:

l.AddExtensionObject("a:b", XsltHelper.Instance);
于 2013-01-08T05:51:10.450 回答