1

我正在开发一个嵌入 Orbeon XForms 渲染器的应用程序。我正在使用它来生成 XHTML 而不是 HTML。我们有一个使用 2 个自定义 XBL 组件的表单。

我们传递给 orbeon 的 XHTML 似乎是正确的。<body>但是 Orbeon 生成的 XHTML 包含两次元素上的 xbl 名称空间的定义。这可以防止它被解析为有效的 XML。

这实际上是一个非常复杂的表格,我不能在这里发布,但这个问题的重要部分是:

<xhtml:html
    xmlns:exf="http://www.exforms.org/exf/1-0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:f="http://orbeon.org/oxf/xml/formatting"
    xmlns:fw="http://orionhealth.com/forms/widgets" xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <xhtml:head>
        <!-- Lots of stuff -->
        <xbl:xbl xmlns:xbl="http://www.w3.org/ns/xbl">
            <xbl:script src="...."/>
            <xbl:binding id="fw-autocomplete" element="fw|autocomplete">
                <xbl:template>
                    <!-- Lots of stuff -->
                </xbl:template>
            </xbl:binding>
        </xbl:xbl>
        <xbl:xbl xmlns:xbl="http://www.w3.org/ns/xbl">
            <xbl:script src="...."/>
            <xbl:binding id="fw-datetime" element="fw|datetime">
                <xbl:template>
                    <!-- Lots of stuff -->
                </xbl:template>
            </xbl:binding>
            <xbl:binding id="fw-date" element="fw|date">
                <xbl:template>
                    <!-- Lots of stuff -->
                </xbl:template>
            </xbl:binding>
            <xbl:binding id="fw-partial-date" element="fw|partial-date">
                <xbl:template>
                    <!-- Lots of stuff -->
                </xbl:template>
            </xbl:binding>
        </xbl:xbl>
    </xhtml:head>
    <xhtml:body id="body">
        <!-- Lots of stuff -->
    </xhtml:body>
</xhtml:html>

值得注意的是,虽然定义了两个 XBL 组件,但它们都没有实际用于文档正文中。Orbon 生成的 XHTML(再次简化)是:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:exf="http://www.exforms.org/exf/1-0"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:f="http://orbeon.org/oxf/xml/formatting"
      xmlns:fw="http://orionhealth.com/forms/widgets"
      xmlns:xhtml="http://www.w3.org/1999/xhtml"
      xmlns="http://www.w3.org/1999/xhtml"
      xxforms:noscript="true">
    <head>
        <!-- Lots of Stuff -->
    </head>
    <body xmlns:xbl="http://www.w3.org/ns/xbl" xmlns:xbl="http://www.w3.org/ns/xbl"
          id="body"
          class="yui-skin-sam">
        <!-- Lots of Stuff -->
    </body>
</html>

xmlns:xbl="http://www.w3.org/ns/xbl"注意body标签上的重复项。

谷歌搜索我还没有找到任何关于这个问题的信息,有谁知道会导致这个问题以及我能做些什么来解决它?

我注意到,如果我在<xhtml:html>元素而不是每个<xbl:xbl>元素上定义 xbl 前缀,这似乎不是问题,并且 Orbeon 生成的 XHTML 仅在<xhtml:html>元素上定义了一次该前缀。

4

1 回答 1

1

Orbeon 使用 XSLT 将 XForms 文档转换为 XHTML。XSLT 规范说:

创建的元素节点还将具有样式表树中元素节点上存在的名称空间节点的副本,但字符串值为 XSLT 名称空间 URI ( http://www.w3.org的任何名称空间节点除外/1999/XSL/Transform),声明为扩展命名空间的命名空间 URI(参见 [14.1 扩展元素]),或指定为排除命名空间的命名空间 URI。

这意味着必须根据规范复制源文档中的两个命名空间声明,无论它们在结果文档中的相关性如何。

您偶然发现的在根节点上定义名称空间的解决方案也在一个不相关的问题中进行了讨论。

在 XSLT 2.0 中,您可以将属性添加copy-namespaces="no"xsl:copyorxsl:copy-of元素。

于 2012-06-27T18:38:13.963 回答