Что заставит Orbeon создать дублирующийся префикс xmlns: xbl в режиме XHTML?

Я работаю над приложением, в которое встроено средство визуализации 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" на теге тела.

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

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


person EdC    schedule 04.08.2011    source источник
comment
EdC, действительно, это похоже на ошибку. Не могли бы вы обновить свой вопрос, включив в него полный, но минимальный пример, который мы можем использовать для его воспроизведения? (Думаю, вы сможете воспроизвести это даже с компонентами XBL, которые содержат минимальное количество разметки - скажем, просто <span>). Затем заставьте также разместить здесь комментарий, чтобы мы получили уведомление от Stack Overflow.   -  person avernet    schedule 17.08.2011


Ответы (1)


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

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

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

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

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

person Paul Sweatte    schedule 27.06.2012
comment
Принятие, поскольку я чувствую, что это так близко, как мы когда-либо сможем ответить на этот вопрос. На первый взгляд это имеет смысл, но странно, что спецификация XSLT потребовала дублирования пространства имен в этой ситуации, что делает результирующий XML недействительным. - person EdC; 13.09.2012
comment
Это один из многих сбивающих с толку аспектов преобразования кода с пространством имен и попытки сохранить контекст. Есть похожие вопросы и другие решения, но без серебряной пули. - person Paul Sweatte; 13.09.2012