在c#中实现exslt.dynamic.evaluate(XslCompiledTransform)

时间:2010-03-16 15:55:21

标签: c# xml xslt exslt

我有一个使用exslt:dynamic模块的样式表,更准确地说,它只使用evaluate函数。我知道.NET 2.0中的XslCompiledTransform没有实现这个模块(就像Mvp.Xml中的ExslTransform一样)。

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

Mvp.Xml包含类似的扩展函数dyn2:dynamic

  

对象dyn2:evaluate(node-set,   string,string?)

     

dyn2:evaluate函数评估a   string作为XPath表达式和   返回结果值,即   可能是布尔值,数字,字符串,   节点集,结果树片段或   外部对象。

     

第一个节点集参数提供了一个   上下文节点(中的第一个节点)   传递节点集),这样选择   路径是相对于它评估的。   第二个字符串参数是XPath   要评估的表达式。第三   可选字符串参数提供   要使用的命名空间绑定   解析中的名称空间前缀   XPath表达式。命名空间是   在XML样式中定义的空间   分隔的命名空间列表   声明属性。

     

所有名称空间前缀   上下文节点的范围(或其范围)   父节点,如果上下文节点不是   元素节点)可以在中引用   评估XPath表达式。注意   虽然这依赖于命名空间   源XML中定义的前缀是   非常不可靠。我们鼓励用户   明确定义命名空间绑定   而在第三个论点中。

     

如果节点集首先传递   参数为空(没有上下文节点)或   表达式字符串作为传递   第二个参数是无效的XPath   表达式(包括空的   string),这个函数返回一个   空字符串。畸形名称空间   第三个参数中的声明是   忽略。

     

请注意,此功能更多   限于EXSLT的dyn:evaluate()   功能。更正式地说:

     
      
  • 没有上下文位置和上下文大小信息。
  •   
  • 无变量绑定 - 此函数无法评估包含变量引用的XPath表达式!
  •   
  • 没有自定义扩展功能 - 只有核心XPath功能和EXSLT.NET支持的所有扩展功能。
  •   
  • 没有当前节点,因此表达式不能包含current()函数调用。
  •   
  • 没有可用的密钥定义信息,因此表达式不能包含key()函数调用。
  •   
  • 没有自定义小数格式定义可用,所以   表达式不能包含   fomat-number()函数调用它   参考a   定义
  •   

该扩展函数没有1个参数版本,因为它没有上下文来评估表达式。

以下扩展是evaluate的1参数版本。评估上下文是固定的。

public class MyExtension
{
    IXPathNavigable context;
    public MyExtension( IXPathNavigable context )
    {
        this.context = context;
    }
    public object Evaluate( string expression )
    {
        return context.CreateNavigator().Evaluate( expression );
    }
}

XsltArgumentList args = new XsltArgumentList();
args.AddExtensionObject("my-ext", new MyExtension(doc));

xslt.Transform( doc, args output );

答案 1 :(得分:1)

这是我的最后一个扩展对象,它使用exslt中的一个参数evaluate函数:

public class DynamicExtension
{
    XPathNavigator _context;
    IXmlNamespaceResolver _namespaceResolver;

    public DynamicExtension(XPathNavigator p_context, IXmlNamespaceResolver p_namespaceResolver)
    {
        _context = p_context;
        _namespaceResolver= p_namespaceResolver;
    }

    public object evaluate(string p_expression)
    {
        return _context.Evaluate(p_expression, _namespaceResolver);
    }
}

传递给构造函数的IXmlNameSpaceResolver是XmlNamespaceManager的一个实例。我需要它,因为我的xml中的节点具有名称空间前缀。 重要的是,evaluate方法的大小写与xsl中使用的大小写匹配。 最后,接口IXPathNavigable没有Evaluate函数,我必须传递一个XPathNavigator对象(来自我的XmlDocument.CreateNavigator方法)。