PI 参数

概述

XSLT 支持在执行样式表时将参数传递给样式表的概念。 使用 JavaScript 中的 XSLTProcessor 时,这样做已经有一段时间了。 但是,当使用 <?xml-stylesheet?> 处理指令 (PI) 时,以前没有办法提供参数。

为了解决这个问题,在 Firefox 2 中实现了两个新的 PI(有关详细信息,请参见下面的 支持的版本),<?xslt-param?><?xslt-param-namespace?>。 两个 PI 都可以包含“伪属性”,就像 xml-stylesheet PI 一样。

以下文档将两个参数“color”和“size”传递给样式表“style.xsl”。

xml
<?xslt-param name="color" value="blue"?>
<?xslt-param name="size" select="2"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>

请注意,当使用 JavaScript 中的 XSLTProcessor 对象进行转换时,这些 PI 不会有任何影响。

处理指令

xslt-paramxslt-param-namespace PI 中的属性使用 xml-stylesheet 中定义的规则进行解析。 任何无法识别的属性都必须被忽略。 只要该属性遵循 xml-stylesheet 中的语法,解析任何属性都不应因存在无法识别的属性而失败。

xslt-paramxslt-param-namespace PI 必须出现在文档的前言中,即第一个元素标签之前。 前言中的所有 PI 都必须得到遵守,包括出现在任何 xml-stylesheet PI 之前和之后的 PI。

如果存在多个 xml-stylesheet PI,则参数将应用于所有样式表,这是因为所有样式表都根据 XSLT 规范导入到一个样式表中。reference? 请注意,Firefox 目前不支持多个 xml-stylesheet XSLT PI。

xslt-param

xslt-param PI 支持 4 个属性

name

name

参数名称的局部名称部分。 属性不会进行语法检查,但是如果它不是有效的 NCName,则它将永远不会匹配样式表中的任何参数。

namespace

参数名称的命名空间。 属性不会进行语法检查。

value

包含参数的字符串值。 属性的值用作参数的值。 数据类型将始终为 string

select

参数的 XPath 表达式。 属性的值将解析为 XPath 表达式。 评估表达式的结果用作参数的值。

如果 name 属性缺失或为空,则忽略 PI。

如果 namespace 属性缺失或为空,则使用空命名空间。

指定样式表中不存在的参数名称(或样式表中的变量)不是错误。 PI 将被忽略。

如果 valueselect 同时存在,或者 valueselect 都不存在,则忽略 PI。

请注意,value="..." 不完全等于 select="'...'",因为值可以同时包含撇号和引号字符。

示例

xml
<?xslt-param name="color" value="red"?>

将参数“color”设置为字符串“red”

xml
<?xslt-param name="columns" select="2"?>

将参数“columns”设置为数字 2

xml
<?xslt-param name="books" select="//book"?>

将参数“books”设置为包含空命名空间中所有 <book> 元素的节点集

xml
<?xslt-param name="show-toc" select="true()"?>
将参数“show-toc”设置为布尔值 true

select 属性上下文

  • 以下上下文用于解析和评估 select 属性中的表达式。
  • 上下文节点是执行样式表时用作初始当前节点的节点。
  • 上下文位置是在执行样式表时用作初始当前节点列表的上下文节点的位置。
  • 上下文大小是在执行样式表时用作初始当前节点列表的大小。
  • 没有可用的变量。
  • 函数库是标准 XPath 函数库。

命名空间声明由 xslt-param-namespace PI 确定,见下文。

如果 select 属性无法解析或执行,则忽略 PI(特别是,它不会回退到 value 属性)。

xslt-param-namespace

xslt-param-namespace 使用两个属性

prefix

参数名称的局部名称部分。 属性不会进行语法检查,但是如果它不是有效的 NCName,则它将永远不会匹配样式表中的任何参数。

要映射的前缀。

namespace

前缀映射到的命名空间。

xslt-param-namespace PI 会影响 select 属性中所有 xslt-param 的表达式,这些 xslt-param 紧随 PI 之后。 这即使在 xslt-param-namespacexslt-param PI 之间存在其他节点(如注释或其他 PI)的情况下也是如此。

多个 PI 使用相同的前缀不是错误,每个新的 PI 只是更改前缀映射到的命名空间。

请注意,value="..." 不完全等于 select="'...'",因为值可以同时包含撇号和引号字符。

如果 prefix 缺失、为空或等于无效的 NCName,则忽略 PI。

xml
<?xslt-param-namespace prefix="my" namespace="http://www.example.org/myNamespace"?>
<?xslt-param name="books" select="//my:book"?>

如果 namespace 缺失,则忽略 PI。 如果 namespace 为空,则删除前缀映射。

将参数“books”设置为包含 http://www.example.org/myNamespace 命名空间中所有 <book> 元素的节点集

支持的版本

从 Firefox 2.0.0.1 开始支持。 value 属性在 Firefox 2 中受支持,但在 2.0 版本中,select 属性对于某些表达式会导致崩溃。

可能的未来发展