Объединить несколько таблиц стилей xslt - PullRequest
7 голосов
/ 16 сентября 2008

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

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

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

Ответы [ 5 ]

16 голосов
/ 16 сентября 2008

Вы можете использовать таблицу стилей 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, и, кажется, он работает нормально.

2 голосов
/ 16 сентября 2008

Невозможно включить импортированные таблицы стилей в основной файл, не нарушая приоритет импорта . Например, вы определяете переменную верхнего уровня в импортированной таблице стилей и переопределяете ее в основном файле. Если вы объедините два файла в один, вы получите две переменные с одинаковым именем и приоритетом импорта, что приведет к ошибке.

Обходной путь - это два замены xsl: import на xsl: include и устранение любых конфликтов . После этого вы можете смело заменять xsl: include инструкциями на содержимое соответствующих файлов, потому что это то, что XSLT-процессор делает :

Включение работает на уровне дерева XML. Ресурс, расположенный по значению атрибута href, анализируется как документ XML, и дочерние элементы элемента xsl: stylesheet в этом документе заменяют элемент xsl: include во включающем документе. Тот факт, что шаблонные правила или определения включены, не влияет на способ их обработки.

1 голос
/ 16 сентября 2008

Ручное слияние, вероятно, будет лучшим вариантом.

Основное соображение, вероятно, будет заключаться в том, чтобы убедиться, что логика сопоставления шаблонов работает в комбинированной таблице стилей.

0 голосов
/ 23 июня 2009
 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/>
0 голосов
/ 16 сентября 2008

Зачем вам это нужно? Они обычно разлучаются по какой-то причине (часто ремонтопригодность)

Вы всегда можете написать слияние самостоятельно - прочитайте XSL-файлы, выберите элементы шаблона, которые вас интересуют, и запишите в новый основной XSL-файл ...

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