Динамический импорт XSLT внутри другого - PullRequest
0 голосов
/ 28 апреля 2011

В нашей работе у нас есть специальная структура, которая помогает нам создавать быстрые и мощные страницы для наших клиентских сервисов.Одним из компонентов этого фреймворка является специальная функция «Подробности», которая позволяет вам выбрать конкретный элемент списка, щелкнуть по нему и просмотреть его детали.Это сделано потому, что компонент Detail получает предопределенную структуру XML и анализирует ее с помощью XSLT, что позволяет ему представлять данные на разных вкладках данных, показывать изображения или суммировать конкретные данные, среди других функций.

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

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

  • type: , которая сообщает родительскому XSLT, что эта вкладка должнане разбирается со стандартным преобразованием XSL.(например: «Литерал»)

  • translationSource: , который сообщает родительскому XSLT, какой новый XSLT он должен включить / импортировать для преобразования этой конкретной вкладки.(например: "newTransformation.xslt")

Возможно ли это сделать динамически?Что-то вроде этого:

<div>
  <xsl:for-each select="Tab"> 
    <xsl:choose>
      <xsl:when test="@type='Literal'">
        <xsl:include href=<xsl:value-of select='@transformationSource'/> 
      </xsl:when>
      <xsl:otherwise> --do what it does everytime
        <xsl:apply-templates select="Header" />
        <xsl:apply-templates select="Data" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</div>

У нас есть две проблемы с этим:

  1. Мы не можем выполнить команду value-of xsl внутри другой команды xsl

  2. Мы не можем использовать функцию включения или импорта в некоммерческом html-компоненте, что означает, что его нельзя использовать внутри div, таблицы, строки или чего-либо еще.

Буду признателен за любые идеи.

Заранее спасибо:)

1 Ответ

1 голос
/ 28 апреля 2011

Объявления xsl: include и xsl: import всегда оцениваются во время компиляции: вы не можете выполнить код XSLT, пока не соберете все необходимые модули таблиц стилей.для таблицы стилей S вы должны написать «слой настройки» в виде модуля M, который добавляет или переопределяет правила в S, а затем вы должны выполнить импорт M из S. Затем следует выполнить преобразование, указав M в качестве таблицы стилей.

Если вам действительно нужно взглянуть на XML, прежде чем принимать решение о том, как построить таблицу стилей, то вам нужно создать конвейер, в котором первый шаг создает таблицу стилей, а второй выполняет ее.Вы можете сделать это, используя инструменты конвейера, такие как Xproc (или Orbeon или Cocoon или xmlsh или даже Ant ...)

...