xsl: импорт и xsl: включение в таблицы стилей не работают в Google Chrome
-
06-07-2019 - |
Вопрос
Я создаю веб-сайт, который использует таблицы стилей xsl, и я создаю небольшую библиотеку полезных функций в таблице стилей util, с которой импортируются другие таблицы
<xsl:import href="util" />
в верхней части каждого листа.Это не работает в Google Chrome, так как он пока не поддерживает xsl: импорт.Может кто-нибудь, пожалуйста, написать мне таблицу стилей, которую я могу запустить на стороне сервера, которая будет считывать строку xsl: import и импортировать соответствующую таблицу стилей перед ее отправкой клиенту?
Решение
Я бы сделал что-то вроде следующего, которое объединит серверную таблицу стилей, прежде чем она попадет в Chrome. Первый шаг на месте, потому что xsl:import
отличается от замены всех мест импортированными таблицами стилей.
xsl:include
на <=> (приоритет импорта не применим к <=>, поэтому вам может потребоваться изменить код и использовать приоритеты) <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.
Другие советы
Вы можете сделать это в 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)
Тогда просто подайте вещь обратно.
Попробуйте что-то подобное в 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 );
?>
http://www.w3.org/TR/xslt#literal -result-element показывает, как решить проблему с duplicate-xsl-namespace при написании таблицы стилей XSL, которая преобразует вашу существующую таблицу стилей XSL в таблицу стилей XSL с расширением <xsl:import>
.
Будьте осторожны с разницей между <xsl:include>
и <=>.