xsl: import и xsl: include в таблицах стилей не работают в Google Chrome - PullRequest
5 голосов
/ 25 октября 2009

Я создаю веб-сайт, который использует таблицы стилей xsl, и я создаю небольшую библиотеку полезных функций в таблице стилей util, которую другие таблицы импортируют с помощью

<xsl:import href="util" />

вверху каждого листа. Это не работает в Google Chrome, так как пока не поддерживает xsl: import. Может кто-нибудь написать мне таблицу стилей, которую я могу запустить на стороне сервера, которая будет читать строку xsl: import и импортировать соответствующую таблицу стилей до ее отправки клиенту?

Ответы [ 4 ]

5 голосов
/ 25 октября 2009

Я бы сделал что-то вроде следующего, которое объединит серверную таблицу стилей, прежде чем она попадет в Chrome. Первый шаг на месте, потому что xsl:import - это не то же самое, что замена всех мест импортированными таблицами стилей.

  1. Заменить все xsl:import на xsl:include (приоритет импорта не применим к xsl:include, поэтому вам может потребоваться изменить код и использовать вместо него приоритеты)
  2. Используйте приведенную ниже таблицу стилей на стороне сервера, чтобы объединить их в одну перед подачей
  3. Подождите несколько недель (могут быть месяцы). Я создал исправление для Chrome и в настоящее время работаю с командой разработчиков, чтобы включить это исправление в сборку.
<xsl:template match="node()">
    <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="xsl:include">
   <!-- you'll probably want to be a bit more restrictive here -->
   <xsl:copy-of select="document(@href)/xsl:stylesheet/*" />
</xsl:template>

Обновление: Просто примечание: ошибка Chrome появляется и в Safari.

2 голосов
/ 25 октября 2009

Вы можете сделать это в Python с модулями libxml2 и libxslt ... не для того, чтобы делать всю работу за вас, а начинать с чего-то вроде этого:

import libxml2, libxslt

styledoc = libxml2.parseFile("page.xsl")
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseFile("somefile.xml")
result = style.applyStylesheet(doc, None)

Тогда просто подайте вещь обратно.

1 голос
/ 25 октября 2009

Попробуйте что-то вроде этого в php:

<?php
$sXml  = "<xml>";
$sXml .= "<testtag>hello tester</testtag>";
$sXml .= "</xml>";

# LOAD XML FILE
$XML = new DOMDocument();
$XML->loadXML( $sXml );

# START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
#PRINT
print $xslt->transformToXML( $XML );
?>

0 голосов
/ 25 октября 2009

http://www.w3.org/TR/xslt#literal-result-element показывает, как решить проблему с duplicate-xsl-namespace при написании таблицы стилей XSL, которая преобразует вашу существующую таблицу стилей XSL в таблицу стилей XSL с расширением <xsl:import> s.

Однако будьте осторожны с разницей между <xsl:import> и <xsl:include>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...