我有一个使用 exslt:dynamic 模块的样式表,更准确地说,它只使用评估函数。我知道 .NET 2.0 中的 XslCompiledTransform 没有实现这个模块(就像 Mvp.Xml 中的 ExslTransform 一样)。
知道如何解决这个问题吗?
这是我使用 exslt 中的一个参数评估函数的最终扩展对象:
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 中的节点具有命名空间前缀。评估方法的大小写必须与 xsl 中使用的大小写相匹配,这一点很重要。最后,IXPathNavigable 接口没有 Evaluate 函数,我必须传递一个 XPathNavigator 对象(从我的 XmlDocument.CreateNavigator 方法获得)。
Mvp.Xml包含一个类似的扩展函数dyn2:dynamic。
object dyn2:evaluate (node-set, string, string?)
dyn2:evaluate 函数将字符串计算为 XPath 表达式并返回结果值,该值可能是布尔值、数字、字符串、节点集、结果树片段或外部对象。
第一个节点集参数提供一个上下文节点(传递的节点集中的第一个节点),以便相对于它评估选择路径。第二个字符串参数是要计算的 XPath 表达式。第三个可选字符串参数提供名称空间绑定,用于解析 XPath 表达式中的名称空间前缀。命名空间以 XML 样式定义,作为命名空间声明属性的空格分隔列表。
上下文节点(或其父节点,如果上下文节点不是元素节点)范围内的所有命名空间前缀都可以在评估的 XPath 表达式中引用。请注意,依赖源 XML 中定义的名称空间前缀是非常不可靠的。我们鼓励用户在第三个参数中明确定义命名空间绑定。
如果作为第一个参数传递的节点集为空(无上下文节点)或作为第二个参数传递的表达式字符串是无效的 XPath 表达式(包括空字符串),则此函数返回一个空字符串。第三个参数中格式错误的命名空间声明将被忽略。
请注意,此函数比 EXSLT 的 dyn:evaluate() 函数更受限制。更正式地说:
- 没有可用的上下文位置和上下文大小信息。
- 无变量绑定 - 此函数无法评估包含变量引用的 XPath 表达式!
- 没有自定义扩展函数 - 只有核心 XPath 函数和 EXSLT.NET 支持的所有扩展函数可用。
- 没有当前节点,因此表达式不能包含 current() 函数调用。
- 没有可用的键定义信息,因此表达式不能包含 key() 函数调用。
- 没有自定义十进制格式定义可用,因此表达式不能包含引用定义的 fomat-number() 函数调用。
该扩展函数没有 1 个参数版本,因为它没有上下文来评估表达式。
以下扩展是评估的 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 );