当出现错误时,XSLT处理器(Xalan
或Saxon
)执行当前错误处理程序的error()
方法,将消息作为参数发送到该方法。类似地,当发生致命错误或警告时,XSLT处理器会根据需要执行datalError()
或Warning()
方法。
对于所有这三种方法,默认行为是将消息写入当前设备。
要自定义错误处理,请执行以下操作:
Xalan
或Saxon
处理器,在创建%XML.XSLT.ErrorHandler
的子类。在这个子类中,根据需要实现Error()
、FatealError()
和Warning()
方法。这些方法中的每一个都接受单个参数,即包含由XSLT处理器发送的消息的字符串。
这些方法不返回值。
Transform
方法的参数列表中使用它。要指定样式表使用的参数,请执行以下操作:
%ArrayOfDataTypes
的实例在。SetAt()
方法将参数及其值添加到此实例。对于SetAt()
,将第一个参数指定为参数值,将第二个参数指定为参数名称。根据需要添加任意多个参数。
Set tParameters=##class(%ArrayOfDataTypes).%New()
Set tSC=tParameters.SetAt(1,"myparameter")
Set tSC=tParameters.SetAt(2,"anotherparameter")
Transform
方法的pParms
参数。可以不使用%ArrayOfDataType
,而是使用 IRIS多维数组,该数组可以具有任意数量的具有以下结构和值的节点:
Node | Value |
---|---|
arrayname("parameter_name") | Value of the parameter named by parameter_name |
可以在InterSystems IRIS中创建XSLT
扩展函数,然后在样式表中使用它们,如下所示:
XSLT2.0
(Saxon
处理器),可以使用名称空间com.intersystems.xsltgateway.XSLTGateway
中的evaluate
函数或名称空间http://extension-functions.intersystems.com
中的evaluate
函数XSLT1.0
(Xalan
处理器),只能在名称空间http://extension-functions.intersystems.com
中使用evaluate
函数默认情况下(举个例子),后一个函数反转它接收到的字符。但是,通常不使用默认行为,因为实现了一些其他行为。要模拟多个单独的函数,需要传递一个选择器作为第一个参数,并实现一个开关,该开关使用该值选择要执行的处理。
在内部,evaluate
函数作为XSLT回调处理程序中的方法(evaluate()
)实现。
要添加和使用XSLT扩展函数,请执行以下操作:
Xalan
或Saxon
处理器,在创建%XML.XSLT.CallbackHandler
的子类。在这个子类中,根据需要实现evaluate()
方法。请参阅下一小节。evaluate
函数所属的命名空间,并根据需要使用evaluate
函数。请参阅下一小节。Transform
方法的参数列表中使用它。请参阅“执行XSLT转换”。在内部,调用XSLT
处理器的代码可以将任意数量的位置参数传递给当前回调处理程序的evaluate()
方法,该方法将它们作为具有以下结构的数组接收:
Node | Value |
---|---|
Args | 参数数量 |
Args(index) | 位置索引中参数的值 |
该方法只有一个返回值。返回值可以是:
%XML.XSLT.StreamAdapter
实例中,使XSLT处理器能够读取流。以下是部分示例:Method evaluate(Args...) As %String
{
//create stream
///...
// create instance of %XML.XSLT.StreamAdapter to
// contain the stream
Set return=##class(%XML.XSLT.StreamAdapter).%New(tStream)
Quit return
}
要在XSLT中使用XSLT扩展函数,必须在XSLT样式表中声明扩展函数的名称空间。对于InterSystems evaluate函数,此命名空间是http://extension-functions.intersystems.com
或com.intersystems.xsltgateway.XSLTGateway
,如前所述。
下面的示例显示使用evaluate的样式表:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:isc="http://extension-functions.intersystems.com">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//@* | //node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/s1/s2/s3">
<xsl:apply-templates select="@*"/>
<xsl:choose>
<xsl:when test="function-available('isc:evaluate')">
<xsl:copy>
<xsl:value-of select="isc:evaluate(.)" disable-output-escaping="yes"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
XSLT2.0网关将evaluate
函数调用缓存在isc:evaluate
缓存中。缓存的默认最大大小为1000
个项目,但可以将大小设置为不同的值。此外,还可以清除缓存、转储缓存,还可以从%List
中预先填充缓存。使用以下格式:
缓存还包括可缓存的函数名称的过滤器列表。请注意以下事项:
evaluate
调用。将函数名添加到筛选器列表不会限制求值缓存的大小。可以对同一函数进行任意数量的调用,但具有不同的参数和返回值。函数名和参数的每个组合都是求值缓存中的一个单独条目。
可以使用%XML.XSLT2.Transformer
中的方法来操作求值缓存。
Studio提供了一个执行XSLT转换的向导,当希望快速测试样式表或自定义XSLT扩展函数时,该向导非常有用。要使用此架构向导,请执行以下操作:
%XML.XSLT.CallbackHandler
的子类,请指定以下详细信息:对话框底部显示转换后的文件。可以从该区域复制和粘贴。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。