Что может заставить Orbeon создавать дубликат префикса xmlns: xbl в режиме XHTML? - PullRequest
1 голос
/ 04 августа 2011

Я работаю над приложением, которое встраивает рендерер Orbeon XForms.Я использую это для генерации XHTML, а не HTML.У нас есть форма, которая использует 2 пользовательских компонента XBL.

XHTML, который мы передаем orbeon, кажется правильным.Но полученный XHTML от Orbeon дважды содержит определение пространства имен xbl для элемента <body>.Это предотвращает его синтаксический анализ в качестве действительного 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 определены, ни один из них на самом деле не используется в теле документа.В результате получается XHTML от Orbon (опять упрощенно):

<?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.

Поиск в Google Я ничего не нашел по этой проблеме, кто-нибудьзнаете, что могло бы вызвать это и что я могу исправить?

Я заметил, что, если я определяю префикс xbl для элемента <xhtml:html> вместо каждого элемента <xbl:xbl>, это, кажется, непроблема, и в результате XHTML вне Orbeon этот префикс определяется только один раз для элемента <xhtml:html>.

1 Ответ

1 голос
/ 27 июня 2012

Orbeon использует XSLT для перевода документа XForms в XHTML. XSLT spec говорит:

Созданный узел элемента также будет иметь копию узлов пространства имен, которые присутствовали на узле элемента в дереве таблицы стилей, за исключением любого узла пространства имен, строковое значение которого является URI пространства имен XSLT (http://www.w3.org/1999/XSL/Transform), URI пространства имен, объявленный как пространство имен расширения (см. [14.1 Элементы расширения]), или URI пространства имен, обозначенный как исключенное пространство имен.

Это означает, что два объявления пространства имен в исходном документе должны были быть скопированы в соответствии со спецификацией, независимо от их актуальности в результирующем документе.

Решение, с которым вы столкнулись при определении пространства имен на корневом узле, также обсуждалось в несвязанном вопросе .

В XSLT 2.0 вы можете добавить атрибут copy-namespaces="no" к элементу xsl:copy или xsl:copy-of.

...