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>。