Altova XMLSpy 2023 Enterprise Edition

使用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中声明的参数及其默认值插入到对话框中。这使您能够快速添加已声明的参数,然后根据需要更改其默认值。

XSLParameters
提示:一旦在对话框中输入了一组参数值,它将用于所有后续的转换,直至它被明确删除或重新启动应用程序。在对话框中输入的参数是在该会话的应用程序级别指定的,并且从那一刻起,通过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文档的变量声明中指定的。

XQueryVariables
提示:一旦在对话框中输入了一组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 )

 

© 2017-2023 Altova GmbH