XSL参数/XQuery变量
使用XSL/XQuery | XSL参数/XQuery变量命令将打开“XSLT输入参数/XQuery外部变量”对话框(参见截图)。您可以输入一个或多个要传递给XSLT样式表的参数的名称,或一个或多个要传递给XQuery文档的XQuery外部变量的名称,以及它们各自的值。这些参数在XMLSpy中的用法如下:
•当使用“XSL/XQuery”菜单中的XSL转换命令转换XML文档时,当前保存在对话框中的参数值将传递给选定的XSLT文档并用于转换。
•当使用“XSL/XQuery”菜单中的XQuery执行命令处理XQuery文档时,当前保存在对话框中的XQuery外部变量值将传递给XQuery文档用于执行。
提示: | 您在“XSLT输入参数/XQuery外部变量”对话框中输入的参数或变量仅会传递给内置的Altova XSLT引擎。因此,如果您使用的是MSXML或已配置的其他外部引擎,则不会将这些参数传递给该引擎。 |
提示: | 如果一个XSLT参数或外部XQuery变量在“XSLT输入参数/XQuery外部变量”对话框中被定义,但没有用于XSLT/XQuery文档或转换,这不是一个错误。 |
使用XSLT参数
您为参数输入的值可以是一个不带引号的XPath表达式,也可以是一个用引号分隔的文本字符串。如果活动文档是XSLT文档,则将启用从XSL中获取按钮。单击此按钮将在XSLT中声明的参数及其默认值插入到对话框中。这使您能够快速添加已声明的参数,然后根据需要更改其默认值。
提示: | 一旦在对话框中输入了一组参数值,它将用于所有后续的转换,直至它被明确删除或重新启动应用程序。在对话框中输入的参数是在该会话的应用程序级别指定的,并且从那一刻起,通过IDE执行的每个转换都将被传递给相应的XSLT文档。这意味着: |
•参数不与任何特定元素相关联;
•一旦关闭XMLSpy,在对话框中输入的任何参数都会被删除。
XSLT参数的用法示例
我们有一个包含国家名称及其首都名称的XML文档:
<document>
<countries>
<country name="USA" capital="Washington DC"/>
<country name="UK" capital="London"/>
<country name="France" capital="Paris"/>
<country name="Russia" capital="Moscow"/>
<country name="China" capital="Beijing"/>
</countries>
</document>
下方的XSLT文档将生成一个XML文档,该文档将显示XML文件中的一个国家及其首都。要选择国家,请将其名称作为名为country的参数值输入。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="country" select="'USA'"/>
<xsl:template match="countries">
<xsl:for-each select="country[@name=\$country]">
<country>
<name><xsl:value-of select="\$country"/></name>
<capital><xsl:value-of select="@capital"/></capital>
</country>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当此XSLT文档在上方列出的XML文档上运行时,结果将如下所示:
<country><name>USA</name><capital>Washington DC</capital></country>
现在,如果您在“XSLT输入参数/XQuery外部变量”对话框中创建一个名为country的参数,并为其赋值(参见上方截图),则此值将被传递到XSLT样式表中的country参数以进行转换。这样,您可以在运行时将不同的值传递到不同的参数。
提示:
•如果您使用XSL:FO转换命令(XSL/XQuery | XSL:FO转换),则在“XSLT输入参数/XQuery外部变量”对话框中输入的参数将不会传递到样式表。为了在PDF输出中使用这些参数,首先使用XSLT转换命令(XSL/XQuery | XSL转换)将XML转换为FO,然后使用XSL:FO转换命令(XSL/XQuery | XSL:FO转换)将FO转换为PDF。
•如果您使用的是XSLT处理器,而不是内置的Altova XSLT引擎,则您在“输入参数”对话框中输入的参数将不会传递到外部处理器。
使用XQuery外部变量
您为XQuery外部变量输入的值可以是一个不带引号的XPath表达式,也可以是一个用引号分隔的文本字符串。外部变量的数据类型是在XQuery文档的变量声明中指定的。
提示: | 一旦在对话框中输入了一组XQuery外部变量,它将用于所有后续的转换,直至它被明确删除或重新启动应用程序。在对话框中输入的变量是在应用程序级别指定的,并且从那一刻起,通过IDE执行的每个执行都将被传递给相应的XQuery文档。这意味着: |
•变量不与任何特定文档相关联;
•一旦关闭应用程序(XMLSpy),在对话框中输入的任何变量都会被删除。
XQuery外部变量的用法示例
在下方示例中,在XQuery文档中声明了一个\$first变量,然后在FLWOR表达式的return子句中使用:
xquery version "1.0";
declare variable \$first as xs:string external;
let \$last := "Jones"
return concat(\$first, " ", \$last )
如果外部变量的值(在“XSLT输入参数/XQuery外部变量”对话框中输入)是Peter,则此XQuery将返回Peter Jones。请注意以下几点:
•XQuery文档的变量声明中的external关键词表示该变量是一个外部变量。
•定义变量的静态类型是可选项。如果未在变量声明中指定变量的数据类型,则会将xs:untypedAtomic类型分配给变量值。
•如果在XQuery文档中声明了一个外部变量,但没有将该名称的外部变量传递到XQuery文档,则将报告一个错误。
•如果声明了一个外部变量并将其输入到“XSLT输入参数/XQuery外部变量”对话框中,则它被认为是在正在执行的XQuery文档的范围内。如果在XQuery文档中声明了一个具有该名称的新变量,则该新变量将暂时覆盖范围内的外部变量。例如,尽管范围内的外部变量\$first的值为Peter,下方的XQuery文档也会返回Paul Jones。
xquery version "1.0";
declare variable \$first as xs:string external;
let \$first := "Paul"
let \$last := "Jones"
return concat(\$first, " ", \$last )