Altova XMLSpy 2024 Professional Edition

如果您在Windows机器上的.NET平台上工作,您可以使用以任何一种.NET语言(如C#)编写的扩展函数。.NET扩展函数可以在XPath或Xquery表达式中使用,以调用构造器、属性或.NET类中的方法(静态或实例)。

 

.NET类中的属性可以使用get_PropertyName()语法来调用。

 

本部分分为以下几个小节:

 

.NET:构造函数

.NET:静态方法和静态字段

.NET:实例方法和实例字段

数据类型:从XPath/XQuery到.NET

数据类型:从.NET到XPath/XQuery

 

扩展函数的形式

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表达式标识了要调用的方法并提供了参数。

 

© 2017-2023 Altova GmbH