PI Parameters
PI Parameters
概观
XSLT支持在执行时将参数传递给样式表的概念。在JavaScript中使用XSLTProcessor时,这已经有一段时间了。但是,使用<?xml-stylesheet?>处理指令(PI)时,以前无法提供参数。
为了解决这两个新的PI在Firefox 2中实现(请参阅下面的支持版本以了解详细信息)<?xslt-param?>和<?xslt-param-namespace?>。两个PI都可以像xml-stylesheetPI那样包含“伪属性” 。
以下文档将两个参数“color”和“size”传递给样式表“style.xsl”。
<?xslt-param name="color" value="blue"?>
<?xslt-param name="size" select="2"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
请注意,XSLTProcessor
在JavaScript中使用对象完成转换时,这些PI没有效果。
处理说明
使用xml-stylesheet
中定义的规则分析xslt-param
和xslt-param-namespace
PI中的属性。任何无法识别的属性都必须被忽略。只要该属性遵循其中的语法,任何属性的解析都不能由于存在无法识别的属性而失败。xml-stylesheet
无论是xslt-param
和xslt-param-namespace
必须出现在文档的序言中,第一个元素标记之前IE浏览器。序言中的所有PI都必须得到尊重,无论是在xml-stylesheet
PI 之前发生,还是在任何PI 之后发生。
如果有多个xml-stylesheet
PI,则参数将应用于所有样式表,因为所有样式表都按照XSLT spec.reference导入到单个样式表中?请注意,xml-stylesheet
Firefox中目前不支持多个XSLT PI。
xslt-param
所述xslt-param
PI支持4个属性:
名称参数名称的本地名称部分。没有对属性进行语法检查,但如果它不是有效的NCName,它将永远不匹配样式表中的任何参数。命名空间参数名称的命名空间。没有对属性进行语法检查。值包含参数的字符串
值。该属性的值用作参数的值。数据类型将始终是字符串
。为该参数选择一个XPath表达式。该属性的值被解析为XPath表达式。评估表达式的结果被用作参数的值。
如果name
属性缺失或为空,则PI将被忽略。
如果名称空间
属性缺失或为空,则使用空名称空间
。
指定样式表中不存在的参数名称(或样式表中的变量)不是错误。PI简单地被忽略。
如果value
和select
都存在,或者如果既没有值
也没有select
,则PI被忽略。
请注意,由于该值可能包含撇号和引号字符,value="..."
因此不完全等同select="'...'"
。
例子
将参数'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
属性中的表达式。
- 上下文节点是用作执行样式表时使用的初始当前节点的节点。
- 上下文位置是执行样式表时使用的初始当前节点列表中上下文节点的位置。
- 上下文大小是执行样式表时使用的初始当前节点列表的大小。
- 没有变量可用。
- 函数库是标准的XPath函数库。
- 名称空间声明由
xslt-param-namespace
PI 确定,如下所示。
如果select
属性无法解析或执行,则PI将被忽略(特别是,它不会回退到value
属性)。
xslt-param-namespace
在xslt-param-namespace
使用两个属性:
前缀映射的前缀。名称空间前缀映射到的名称空间。
一个xslt-param-namespace
接口会影响表达选择
所有属性xslt-param
的PI以下秒。即使在PI xslt-param-namespace
和xslt-param
PI 之间有其他节点(如评论或其他PI),也是如此。
多个PI使用相同的前缀不是错误,每个新的PI只是改变前缀映射到的名称空间。
如果前缀
缺失,为空或等于无效的NCName,则PI将被忽略。
如果名称空间
丢失,则PI将被忽略。如果名称空间
为空,则会删除前缀映射。
例子
将参数'books'设置为包含<book>' http://www.example.org/myNamespace '命名空间中所有元素的节点集:
<?xslt-param-namespace prefix="my" namespace="http://www.example.org/myNamespace"?>
<?xslt-param name="books" select="//my:book"?>
支持的版本
自Firefox 2.0.0.1起支持。所述值
属性中的Firefox 2支撑,而是选择
属性崩溃在2.0释放一些表达式。
可能的未来发展
我们应该允许表达式中的任何XSLT函数吗?document()
似乎很有用,但保持不变,generate-id()
应该为同一个文档产生相同的字符串似乎很棘手。
怎么样在XSLT样式表中查询URL参数?例如将它们传递给指定的<xsl:param>。