我正在开发一个嵌入Orbeon XForms渲染器的应用程序。我使用它来生成XHTML,而不是HTML。我们有一个使用2个自定义XBL组件的表单。
我们传递给orbeon的XHTML似乎是正确的。但是从Orbeon得到的XHTML在<body>元素上包含了两次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>注意body标记上的重复xmlns:xbl="http://www.w3.org/ns/xbl"。
谷歌我没有找到任何关于这个问题的东西,有谁知道是什么导致了这个问题,我能做些什么来解决它呢?
我注意到,如果我在<xhtml:html>元素上定义xbl前缀,而不是在每个<xbl:xbl>元素上定义xbl前缀,这似乎不是问题,并且在Orbeon产生的XHTML只在<xhtml:html>元素上定义一次这个前缀。
发布于 2012-06-28 02:38:14
Orbeon使用XSLT将XForms文档转换为XHTML。XSLT spec说:
这意味着源文档中的两个名称空间声明必须按照规范进行复制,而不管它们在结果文档中的相关性。
您偶然发现的在根节点上定义名称空间的解决方案也在an unrelated question中讨论过。
在XSLT2.0中,可以向xsl:copy或xsl:copy-of元素添加copy-namespaces="no"属性。
https://stackoverflow.com/questions/6935915
复制相似问题