Объединение нескольких таблиц стилей xslt
-
09-06-2019 - |
Вопрос
У меня есть таблица стилей xslt с несколькими xsl:import
s, и я хочу объединить их все в один файл xslt.
Это ограничение используемой нами системы, поскольку она передает таблицу стилей xsl как строковый объект, хранящийся в памяти.Это передается на удаленную машину, где она выполняет преобразование.Поскольку он не загружается с диска, ссылки href не работают, поэтому нам нужно удалить xsl:import
s из таблицы стилей.
Есть ли какие-нибудь инструменты, которые могут это сделать?
Решение
Вы можете использовать таблицу стилей XSL для объединения таблиц стилей.Однако это эквивалентно использованию элемента xsl:include, а не xsl:import (как уже указывал Азат Разетдинов).Вы можете прочитать о разнице здесь.
Поэтому вам следует сначала заменить xsl:import на xsl:include, разрешить все конфликты и проверить, получаете ли вы по-прежнему правильные результаты.После этого вы можете использовать следующую таблицу стилей, чтобы объединить существующие таблицы стилей в одну.Просто примените его к своей основной таблице стилей:
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="xsl:include">
<xsl:copy-of select="document(@href)/xsl:stylesheet/*"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Первый шаблон заменяет все xsl:include включенными таблицами стилей с помощью функции document, которая считывает файл, указанный в атрибуте href.Второй шаблон — это трансформация личности.
Я протестировал его с Xalan, и он, кажется, работает нормально.
Другие советы
Невозможно включить импортированные таблицы стилей в основной файл, не нарушив приоритет импорта.Например, вы определяете переменную верхнего уровня в импортированной таблице стилей и переопределяете ее в основном файле.Если вы объедините два файла в один, вы получите две переменные с одинаковым именем и приоритетом импорта, что приведет к ошибке.
Обходной путь состоит в том, чтобы заменить xsl:import на xsl:include и разрешить все конфликты.После этого вы можете смело заменять инструкции xsl:include содержимым соответствующих файлов, потому что именно это и есть XSLT-процессор делает:
Включение работает на уровне дерева XML.Ресурс, расположенный по значению атрибута href, анализируется как XML-документ, а дочерние элементы элемента xsl:stylesheet в этом документе заменяют элемент xsl:include во включающем документе.Тот факт, что включены правила или определения шаблона, не влияет на способ их обработки.
Ручное слияние, вероятно, будет лучшим вариантом.
Основное соображение, вероятно, будет заключаться в том, чтобы убедиться, что логика сопоставления шаблонов работает в объединенной таблице стилей.
Зачем вам это нужно?В конце концов, они обычно разделены по какой-то причине (часто ремонтопригодность)
Вы всегда можете написать слияние самостоятельно — прочитать файлы XSL, выбрать интересующие вас элементы шаблона и записать в новый главный файл XSL...
import multiple xsl in single xsl
<xsl:import href="FpML_FXOption_Trade_Template1.xsl"/>
<xsl:apply-imports/>
<calypso:keyword>
<calypso:name>DisplayOptionStyle</calypso:name>
<calypso:value>Vanilla</calypso:value>
</calypso:keyword>
<xsl:import href="FpML_FXOption_Trade_Template2.xsl"/>
<xsl:apply-imports/>