跳至內容

XSLTForms/XForms 1.1

來自 Wikibooks,開放世界中的開放書籍

此頁面討論了 XSLTForms 對 XForms 1.1 規範的覆蓋範圍,並提到了新使用者可能不太瞭解的其他一些限制。

(在當前狀態下,該頁面並不完整或系統化,而是一些使用者注意到的內容列表,這些使用者將其列在此處。請幫助使該列表更完整,並對 XSLTForms 的新使用者更有用,方法是記錄您遇到的任何限制以及解決這些限制的方法。)

XSLTForms 實現了 XForms 1.1 的大部分功能,但並非完全符合規範的處理器,原因有兩個

  • Web 瀏覽器中的客戶端限制對 XSLTForms 施加了一些限制。
  • 由於時間不足,一些“次要”功能被省略,轉而優先擴充套件對使用者而言更重要的功能(例如富文字編輯器)。

以下各節確定了 XSLTForms 與規範或 XForms 1.1 的其他實現可能存在差異的特定點。各節對應於 XForms 1.1 規範和測試套件的組織結構;一些標題已更改以提高畫質晰度。除非另有說明,否則描述的版本為 1.0RC2(2014 年)。在後續版本中,可能已填補了一些空白,並刪除了一些限制。(在某些情況下已註明,但沒有註明並不意味著沒有發生變化。)

要更全面地瞭解當前覆蓋範圍的差距,可以檢視 XSLTForms 的 XForms 1.1 測試套件結果。(警告:該頁面更新頻率不高,不一定是最新的。)

XForms 1.0 和 XForms 1.1 之間的差異

[編輯 | 編輯原始碼]

XForms 簡介

[編輯 | 編輯原始碼]

文件結構

[編輯 | 編輯原始碼]
  • 在 XSLTForms 中,XHTML 的 src 屬性不能用於連結到非 XML 頁面外部資源。因此,XSLTForms 不支援 <xf:label src="mylabel.txt"/> 這樣的結構;瀏覽器中的 XSLT 1.0 處理器無法讀取非 XML 資源。
  • 例項中的 XML 註釋受支援,但它們不應包含任何大於號(>)。
  • XForms 規範允許從模型中完全省略 xf:instance;然後假設一個非常簡單的平面 XML 結構。XSLTForms 要求顯式例項。
[這在 2010 年是正確的;現在是否仍然正確,或者是否已實現“簡單 XForm”結構?需要進行測試。請注意,XSLTForms 1.0RC2 通過了測試 3.3.2.a。]

處理模型

[編輯 | 編輯原始碼]
  • XSLTForms 每個名稱空間最多可以載入一個外部模式文件;嘗試為同一名稱空間載入多個模式文件將引發 XForms 連結異常。
  • XSLTForms 未實現對 navindexaccesskey 屬性的支援。
  • 在 XSLTForms 中,事件處理有時會偏離規範的字面意思。情況包括以下內容。
    • 一些旨在在發生特定事件時觸發 xf:message 操作的測試實際上並未顯示訊息。相關事件包括:xforms-help 和 xforms-hint;in-range、out-of-range;scroll-first、scroll-last、xforms-binding-exception;xforms-enabled、xforms-disabled。(從測試結果中不清楚此問題是引發預期事件失敗還是 xsl:message 操作無法按預期響應這些事件。)
注意:在版本 r638 中,其中一些測試產生了預期的結果,包括以下測試:scroll-first、scroll-last、xforms-binding-exception。
  • 在某些測試中,XSLTForms 未引發預期的異常,而是引發了不同的異常。
  • 在某些測試中,表單中的錯誤應引發異常(例如 xforms-compute-error 或 xforms-binding-error),但未引發任何異常。(在使用版本 r638 的後續測試中,XSLTForms 通過了這些測試。)
  • 某些異常應為致命錯誤,但在 XSLTForms 中並非如此。
  • 在某些情況下,瀏覽器會凍結,而不是 XSLTForms 引發預期的異常或致命錯誤。
  • 即使 incremental="false" 意味著不應發出某些事件,或者當這些事件由於值未更改而變得不必要時,這些事件也會發出。

資料型別

[編輯 | 編輯原始碼]
  • 內建資料型別 gYear、gYearMonth、date 和 dateTime 僅支援以數字 1 或 2 開頭的四位數年份,因此不會接受諸如 0800-12-25(公元 800 年的聖誕節,查理曼大帝加冕為皇帝)之類的日期。
  • gYear、date 等不接受時區資訊,因此會接受諸如 2010-08-01(2010 年 8 月 1 日)之類的日期,但不接受 2010-08-01Z(UTC 時間 2010 年 8 月 1 日 00:00 開始的 24 小時週期)或 2010-08-01-04:00(東部夏令時 2010 年 8 月 1 日 00:00 開始的 24 小時週期)。

模型項屬性

[編輯 | 編輯原始碼]
  • XForms 規範指出,“嘗試在同一節點上設定兩次模型項屬性是一個錯誤”;這可以理解為允許從不同的 bind 元素在節點上設定不同的模型項屬性。如果多個 bind 元素影響同一節點,即使它們正在設定不同的模型項屬性,XSLTForms 也會引發錯誤。(解決方法:在一個 bind 元素中為任何節點設定所有模型項屬性。)
  • 未實現 p3ptype 屬性。

XForms 中的 XPath 表示式

[編輯 | 編輯原始碼]
  • XPath 允許令牌之間存在空格(因此 a/b/c[@x='y']a /b /c [@x = 'y'] 等效,並且後者形式中的空格可以替換為換行符和更多空格);XSLTForms 中的 XPath 解析器僅在非常受限的位置接受空格,包括謂詞,但不包括在位置路徑中。[此限制可能已在 2016 年解除;需要進行測試。]
  • XSLTForms 1.0RC2 不支援 hmac() 函式,也不支援在 digest() 函式中使用 sha-256。(後續版本都支援。)
  • 在某些情況下,XSLTForms 會計算錯誤的上下文大小。
  • XSLTForms 在型別驗證方面有時比規範規定的更寬鬆。
    • textarea 控制元件繫結到具有複雜型別的元素時,不會引發錯誤。(而是使元素的字串值可供在控制元件中編輯。)
    • 當控制元件的引數不符合資料繫結限制時,不會引發錯誤。

無法識別的名稱空間字首

[編輯 | 編輯原始碼]

在某些情況下,XSLTForms 將無法正確評估 XPath 表示式,因為它無法識別名稱空間字首,即使該字首已正確宣告。情況如下

  • XSLTForms 在 Firefox 或其他基於 Mozilla 的瀏覽器中執行。
  • 表單本身中的任何元素或屬性都不使用名稱空間字首。如果使用該名稱空間的例項文件是外部文件,並且表單中的 XPath 表示式引用該例項文件中的元素,則可能會發生這種情況。

此行為的原因是 Mozilla XSLT 引擎不支援 namespace 軸;這已被報告為錯誤,但尚未修復。

一個簡單的解決方法是在 XForm 中的某個位置插入一個虛擬元素或屬性,該元素或屬性使用相關名稱空間字首。通常將這些放在 XForms 文件的第一個標籤上,連同文件中要使用的所有字首的名稱空間宣告一起。(建立具有相對完整名稱空間宣告集的 XForms 模板可以節省大量後續除錯時間。)

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xhtml="http://www.w3.org/1999/xhtml"
      xsd:dummy="Help the poor user of Mozilla evade the Mozilla namespace curse"
      xhtml:dummy="Help the poor user of Mozilla evade the Mozilla namespace curse">

虛擬屬性的本地名稱和值無關緊要;包含虛擬屬性的目的是確保 XSLTForms 可以透過遍歷元素的祖先並記錄所有實際使用的名稱空間字首來建立名稱空間字首表。

有關更長的示例,請參閱華夏公益教科書XSLTForms 和 eXist以及本華夏公益教科書中對使用者定義函式的討論。

核心表單控制元件

[編輯 | 編輯原始碼]
  • mediatype 不支援檔案上傳。
  • 在 XSLTForms 中,range 控制元件的 startend 屬性都是必需的,而不是可選的。incremental 屬性無法按預期工作。
  • xf:helpxf:hintxf:alert 元素上,XSLTForms 不支援 ref 屬性。當提供多個提示或警報訊息時,XSLTForms 會優先考慮內聯訊息,而不是由單節點繫結屬性指向的例項中的提示。
  • 當呼叫 xf:setfocus 操作將焦點設定到組時,焦點不會設定到組中的第一個控制元件;焦點將被清除。
  • XSLTForms 1.0RC2 不支援 repeat 元素的 startindexnumber 屬性。

output 元素

[編輯 | 編輯原始碼]
  • output 控制元件支援 application/xhtml+xmlimage/svg+xmlimage/* 作為其 mediatype 屬性的值。
  • 該控制元件使用 DOM 節點的 .innerHTML 屬性在 Javascript 中實現。
  • application/xhtml+xml 也可用於 HTML 標籤湯(XSLTForms 不檢查內容是否有效)
  • 內容被視為序列化 (X)HTML,即從 XML 的角度來看只是文字(而不是 CDATA),以 < 和 > 實體序列化標籤。
  • 要使用標籤顯示,例項元素必須使用 XPath 函式 serialize(node) 序列化。

upload 元素

[編輯 | 編輯原始碼]

從歷史上看,upload 控制元件一直難以獲得 XSLTForms 的支援(傳送給 XSLTForms 支援郵件列表的第一條訊息就是關於 upload 支援方面的差距)。該控制元件的 XForms 規範需要比 XSLTForms 使用的 AJAX 庫更容易提供的更多功能。

[此處或在單獨頁面中需要一些關於使用 xf:upload、開箱即用哪些功能以及哪些功能無法使用的討論。]

支援“form-data-post”提交方法的 XSLTForms 修改版本於 2017 年 2 月在https://github.com/Conal-Tuohy/Muscovy/tree/master/xsltforms提供。

容器表單控制元件

[編輯 | 編輯原始碼]
  • 屬性 repeat-model repeat-bind、repeat-nodeset、repeat-startindex 和 repeat-number 的行為與預期不符。
  • xf:copy 元素的行為與預期不符。

XForms 操作

[編輯 | 編輯原始碼]
  • 事件並不總是按規定行為(請參閱上文的處理模型)。
  • 重置和更新可能會被延遲而不是立即執行;對 insertdelete 操作上的各種屬性的測試有時會按預期工作,有時則不會。

XForms 提交模組

[編輯 | 編輯原始碼]
  • xf:submission 元素的幾個屬性不受支援:indentencodingstandalonecdata-section-elementsinvalidseparator
  • 由於瀏覽器的跨域限制,無法支援 XForms 提交模組的許多功能。

用於資料變異的插入和刪除操作模式

[編輯 | 編輯原始碼]

XForms 和樣式

[編輯 | 編輯原始碼]
  • 支援 CSS 偽類 enableddisabled;不支援其他偽類(requiredoptionalvalidinvalidread-onlyread-writeout-of-rangein-range)。
  • 不支援 CSS 偽元素 valuerepeat-itemrepeat-index

另請參閱有關XSLTForms 和 CSS的章節。

完整的 XForms 示例

[編輯 | 編輯原始碼]
  • XSLTForms 不支援 SVG 作為宿主文件語言。
華夏公益教科書