Объединение нескольких таблиц стилей xslt

StackOverflow https://stackoverflow.com/questions/70143

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть таблица стилей xslt с несколькими xsl:imports, и я хочу объединить их все в один файл xslt.

Это ограничение используемой нами системы, поскольку она передает таблицу стилей xsl как строковый объект, хранящийся в памяти.Это передается на удаленную машину, где она выполняет преобразование.Поскольку он не загружается с диска, ссылки href не работают, поэтому нам нужно удалить xsl:imports из таблицы стилей.

Есть ли какие-нибудь инструменты, которые могут это сделать?

Это было полезно?

Решение

Вы можете использовать таблицу стилей 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/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top