跳至内容

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 作为宿主文档语言。
华夏公益教科书