2015-08-23 4 views
1

У меня есть документ с результатами, который отображается в Chrome, но не Mozilla/Firefox.Clientside XSLT в Mozilla/Firefox не работает

I считаю, что это потому,

Как изменить это преобразование, чтобы не иметь начальных пробелов (fiddle)?

XML:

<?xml-stylesheet href="/css/my.xsl" type="text/xsl"?> 
<webpage> 
    <title>Book</title> 
    <auth>Mike</auth> 
    <container-content> 
     <p>foo1</p> 
     <p>foo2</p>  
    </container-content> 
</webpage> 

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="1.0"> 

    <xsl:output 
     method="xml" 
     indent="yes" 
     encoding="UTF-8" 
     omit-xml-declaration="yes" 
     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
     doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="text()"/> 

    <xsl:template match="/"> 
      <html> 
       <head> 
        <meta http-equiv="Content-Type" 
        content="text/html; charset=utf-8"/>     
       </head>    
       <body> 
        <xsl:copy-of select="//container-content/*"/> 
       </body> 
      </html> 
    </xsl:template> 

</xsl:stylesheet> 

Результат:

- a blank line here - 
- and here - 
<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    </head> 
    <body> 
     <p>foo1</p> 
     <p>foo2</p> 
    </body> 
</html> 

Альтернативно, я может быть неправильно, и две пустые строки не являются причиной неудачный рендер в Mozilla/Firefox. У меня проблемы с поиском неполадок на стороне клиента.

Сторона примечания: Я разработал в Saxon 6.5, считая, что Saxon наилучшим образом приближается к тому, что делают браузеры. Я могу ошибаться. Я отмечаю, что Xalan не ставит ведущие пробелы.

+0

Процессоры в браузерах не сериализуются, вместо этого они создают дерево с памятью, так как вы знаете, что есть пустая строка? Кроме того, ваше предположение на Саксоне неверно: оно наилучшим образом соответствует тому, что требуется стандарту W3C, но ни один браузер не близок к стандарту XSLT ... – Abel

+0

Abel .. вы правы. Я не знаю, я угадываю, основываясь на тестировании внешнего браузера. Есть ли способ просмотреть это дерево в памяти? – Paulb

+0

Вместо того, чтобы делать rightclick> View Source, используйте rightclick> Inspect Element. Это работает как в Chrome, так и в Firefox, и покажет вам, что получилось. – Abel

ответ

1

Я просто запустил вашу таблицу стилей с помощью Saxon 6.5, и действительно, она выводит две пустые строки, которые удаляются, если вы меняете xsl:output на отсутствие отступа и с объявлением xml. Тем не менее, я считаю, что это ошибка в Saxon 6.5 (небольшая, так как пробелы не значительны).

Запуск с другими процессорами XSLT 1.0 не показывает пробелов. Однако, как сказано в моем комментарии, пробелы несущественны, так как браузеры не сериализуются в любом случае. (обратите внимание: видимо, браузеры делают сериализацию в том смысле, что они смотрят, используете ли вы выход XML или HTML).

Я провел ваш пример с Firefox, и он «просто работает». Так как ваша таблица стилей делает простую копию XML, она показывает только текст. Если я изменю xsl:output на HTML и добавлю несколько строк, чтобы убедиться, что правильно их запускаю (я добавил <h1>Hello</h1>, он показывает HTML.

Я не уверен, что вы ожидаете от браузера, но мой Угадайте, не XML, но (X) HTML. XSLT 1.0 не очень хорош с XHTML (поддерживается в XSLT 2.0, но это не поддерживается браузерами), но отлично работает с HTML.

Я изменил вашу таблицу стилей следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="1.0"> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="text()"/> 

    <xsl:template match="/"> 
      <html> 
       <head />   
       <body> 
        <xsl:apply-templates />      
       </body> 
      </html> 
    </xsl:template> 

    <xsl:template match="title"> 
     <h1><xsl:value-of select="."/></h1> 
    </xsl:template> 

    <xsl:template match="auth"> 
     <p>Author: <xsl:value-of select="." /></p> 
    </xsl:template> 

</xsl:stylesheet> 

и в Firefox и Chrome он делает следующим образом:

enter image description here

Примечание (1): если вы не запустить его с веб-сервера (локального или удаленного), он не будет работать в любом Firefox или Chrome из-за ограничений безопасности.

Примечание (2): для просмотра предоставленного XML или HTML используйте функцию Inspect Element для инструментов разработчика Chrome или Firefox.

Примечание (3): вам не нужно использовать метатег, поскольку спецификация требует, чтобы этот метатег был выведен, как только он распознал вывод HTML.

Примечание (4), если вы не уверены, является ли или не Firefox загрузки таблицы стилей правильно, см с помощью Firebug, он должен показать что-то вроде этого (марки «200 OK»):

enter image description here

+0

По-прежнему возникают проблемы с моей стороны. Вы используете Noscript в Firefox? Я, и мне интересно, вмешивается ли это. – Paulb

+0

Я использую только addblocker. Попробуйте включить все и все расширения, запустите его с веб-сервера и убедитесь, что путь правильный. Я не уверен, но строгая безопасность может означать, что путь XSLT _ должен быть относительным и на том же уровне или глубже, чем текущий файл_. – Abel

+0

@Paulb: Я добавил дополнительную заметку, которую вы можете использовать, чтобы узнать, что происходит не так. Если вы _do_ видите загруженный XSLT, то измените некоторые вещи в XSLT (например, вывод чего-то другого, как в моем примере выше), чтобы убедиться, что он работает. – Abel

1

Если вы хотите преобразовать в XHTML, то вам необходимо убедиться, что вы используете пространство имен XHTML для элементов результата так выразиться

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    version="1.0"> 

на таблицу стилей, так как в противном случае с помощью метода вывода xml ваши элементы в ни одно пространство имен не распознаются как элементы XHTML Mozilla.

Как ваши входные p элементы также не в пространстве имен вы не можете копировать их через, но должен написать шаблон для них

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"><!-- assumes you have the namespace declaration suggested above --> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

, а затем использовать <xsl:apply-templates select="//container-content/*"/> вместо copy-of. И в этом случае необходимо удалить <xsl:template match="text()"/>, так как текст преобразованных p элементов не будет отображаться.

+0

+1, умное мышление, я не рассматривал это в своем ответе, но, действительно, таким образом он также работает с '' (хотя "Inspect element" не показывает, что это XHTML). Кроме того, в Firefox, по крайней мере, с добавлением 'doc-type', он все равно не будет отображаться. Но в любом случае это не нужно. – Abel

Смежные вопросы