PI 参数
概述
XSLT 支持在执行样式表时向其传递参数的概念。在使用 JavaScript 中的 XSLTProcessor 时,这已经可以实现一段时间了。然而,当使用 <?xml-stylesheet?> 处理指令 (PI) 时,过去无法提供参数。
为了解决这个问题,在 Firefox 2 中实现了两个新的 PI(有关详细信息,请参阅下面的 支持的版本),即 <?xslt-param?> 和 <?xslt-param-namespace?>。这两个 PI 都可以像 xml-stylesheet PI 一样包含“伪属性”。
以下文档将“color”和“size”这两个参数传递给样式表“style.xsl”。
<?xslt-param name="color" value="blue"?>
<?xslt-param name="size" select="2"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
请注意,当使用 JavaScript 中的 XSLTProcessor 对象进行转换时,这些 PI 无效。
处理指令
xslt-param 和 xslt-param-namespace PI 中的属性是使用 xml-stylesheet 中定义的规则进行解析的。任何未识别的属性都必须被忽略。只要属性遵循 xml-stylesheet 中的语法,解析任何属性都不会因未识别属性的存在而失败。
xslt-param 和 xslt-param-namespace PI 都必须出现在文档的 prolog 中,即在第一个元素标签之前。prolog 中的所有 PI 都必须被遵守,包括出现在 xml-stylesheet PI 之前和之后的 PI。
如果存在多个 xml-stylesheet PI,参数将应用于所有样式表,因为根据 XSLT 规范,所有样式表都被导入到一个单独的样式表中。请注意,Firefox 当前不支持多个 xml-stylesheet XSLT PI。
xslt-param
xslt-param PI 支持 4 个属性
name-
参数名称的本地名称部分。对此属性不进行语法检查,但如果它不是有效的 NCName,则永远不会匹配样式表中的任何参数。
namespace-
参数名称的命名空间。对此属性不进行语法检查。
value-
包含参数的字符串值。属性的值用作参数的值。数据类型始终是字符串。
select-
参数的 XPath 表达式。属性的值被解析为 XPath 表达式。评估表达式的结果用作参数的值。
如果 name 属性缺失或为空,则忽略该 PI。
如果 namespace 属性缺失或为空,则使用空命名空间。
指定一个样式表中不存在的参数名称(或者是一个样式表中的变量)并不算错误。该 PI 将被忽略。
如果同时存在 value 和 select,或者两者都不存在,则忽略该 PI。
请注意,value="..." 与 select="'...'" 并不严格相等,因为 value 可以同时包含撇号和引号字符。
示例
将参数 'color' 设置为字符串 'red'
<?xslt-param name="color" value="red"?>
将参数 'columns' 设置为数字 2
<?xslt-param name="columns" select="2"?>
将参数 'books' 设置为包含空命名空间中所有 <book> 元素的节点集
<?xslt-param name="books" select="//book"?>
将参数 'show-toc' 设置为布尔值 true
<?xslt-param name="show-toc" select="true()"?>
select 属性的上下文
以下上下文用于解析和评估 select 属性中的表达式。
- 上下文节点是执行样式表时用作初始当前节点的节点。
- 上下文位置是执行样式表时初始当前节点列表中的上下文节点的位置。
- 上下文大小是执行样式表时初始当前节点列表的大小。
- 没有可用的变量。
- 函数库是标准的 XPath 函数库。
- 命名空间声明由
xslt-param-namespacePI 确定,请参阅下文。
如果 select 属性解析或执行失败,则忽略该 PI(特别是,它不会回退到 value 属性)。
xslt-param-namespace
xslt-param-namespace 使用两个属性
一个 xslt-param-namespace PI 会影响后面所有 xslt-param 的 select 属性中的表达式。即使在 xslt-param-namespace 和 xslt-param PI 之间存在其他节点(如注释或其他 PI),这种情况也适用。
多个 PI 使用同一个前缀并不算错误,每个新的 PI 只是更改了前缀映射到的命名空间。
如果 prefix 缺失、为空或等于一个无效的 NCName,则忽略该 PI。
如果 namespace 缺失,则忽略该 PI。如果 namespace 为空,则移除该前缀映射。
示例
将参数 'books' 设置为包含 http://www.example.org/myNamespace 命名空间中所有 <book> 元素的节点集
<?xslt-param-namespace prefix="my" namespace="http://www.example.org/myNamespace"?>
<?xslt-param name="books" select="//my:book"?>
支持的版本
支持从 Firefox 2.0.0.1 开始。value 属性在 Firefox 2 中得到支持,但在 2.0 版本中,select 属性对于某些表达式会崩溃。
未来的可能发展
我们是否应该允许在表达式中使用任何 XSLT 函数?document() 似乎很有用,但要维护 generate-id() 应该为同一文档生成相同字符串的不变性似乎很棘手。
如何查询 XSLT 样式表中的 URL 参数?例如,将它们传递给指定的 <xsl:param>。