.NET扩展函数
如果您在Windows机器上的.NET平台上工作,您可以使用以任何一种.NET语言(如C#)编写的扩展函数。.NET扩展函数可以在XPath或Xquery表达式中使用,以调用构造器、属性或.NET类中的方法(静态或实例)。
.NET类中的属性可以使用get_PropertyName()语法来调用。
本部分分为以下几个小节:
扩展函数的形式
XPath/XQuery表达式中的扩展函数必须具有以下形式:prefix:fname()。
•prefix:部分与一个URI相关联,该URI标识了被处理的.NET类。
•fname()标识了.NET类中的构造器、属性或方法(静态或实例),并根据需要提供参数。
•URI必须以clitype: (它将函数标识为.NET扩展函数的)开头。
•扩展函数的prefix:fname()形式可以用于系统类和加载程序集中的类。然而,如果一个类是需要被加载的,则必须提供包含所需信息的附加参数。
参数
要加载一个程序集,请使用以下参数:
asm | 要加载的程序集的名称。 |
ver | 版本号(最多为四个用点分隔的整数)。 |
sn | 程序集的强名称的公钥令牌(16位十六进制数字)。 |
from | 一个URI,提供要加载的程序集(DLL)的位置。如果URI是相对的,则它是相对于XSLT或XQuery文档的。如果存在该参数,则将忽略其他参数。 |
partialname | 程序集的部分名称。它将被提供给Assembly.LoadWith.PartialName(),该方法将尝试加载该程序集。如果存在partialname,则将忽略其他参数。 |
loc | 区域设置,如en-US。默认值为neutral。 |
如果要从DLL加载程序集,请使用from参数,并忽略sn参数。如果要从GAC加载程序集,请使用sn参数,并忽略from参数。
必须在第一个参数之前插入一个问号,参数之间必须用一个分号分隔。参数名称用等号给出它的值(参见下方示例)。
命名空间声明示例
以下示例是在XSLT中的命名空间声明,它标识了系统类System.Environment:
xmlns:myns="clitype:System.Environment"
以下示例是在XSLT中的命名空间声明,它将要加载的类标识为Trade.Forward.Scrip:
xmlns:myns="clitype:Trade.Forward.Scrip?asm=forward;version=10.6.2.1"
以下示例是在XQuery中的命名空间声明,它标识了系统类MyManagedDLL.testClass:。这里区分了两种情况:
1.当从GAC加载程序集时:
declare namespace cs="clitype:MyManagedDLL.testClass?asm=MyManagedDLL; |
ver=1.2.3.4;loc=neutral;sn=b9f091b72dccfba8";
2.当从DLL加载程序集时(以下是完整和部分的引用):
declare namespace cs="clitype:MyManagedDLL.testClass?from=file:///C:/Altova
Projects/extFunctions/MyManagedDLL.dll;
declare namespace cs="clitype:MyManagedDLL.testClass?from=MyManagedDLL.dll; |
XSLT示例
下方给出了一个完整的XSLT示例,调用系统类中的函数System.Math:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:template match="/">
<math xmlns:math="clitype:System.Math">
<sqrt><xsl:value-of select="math:Sqrt(9)"/></sqrt>
<pi><xsl:value-of select="math:PI()"/></pi>
<e><xsl:value-of select="math:E()"/></e>
<pow><xsl:value-of select="math:Pow(math:PI(), math:E())"/></pow>
</math>
</xsl:template>
</xsl:stylesheet>
math元素的命名空间声明将math:前缀与URI clitype:System.Math关联起来。该URI的开头部分clitype:表示在它之后标识了一个系统类或加载类。XPath表达式中的math:前缀将扩展函数与URI(以及扩展到类)System.Math联系起来。扩展函数标识了类中的方法System.Math并根据需要提供参数。
XQuery示例
下面的XQuery示例与上面的XSLT示例类似:
<math xmlns:math="clitype:System.Math">
{math:Sqrt(9)}
</math>
与上方的XSLT示例一样,命名空间声明标识了.NET类,在本例中为系统类。XQuery表达式标识了要调用的方法并提供了参数。