Мои 2 пенса стоят на простой (но эффективной) альтернативе (для иллюстрации предоставлен только psuedocode. Действовать осторожно :)
Схема подхода:
Альтернативное решение может состоять из простого сценария-оболочки (например, shell, bash-скрипта или другого) для вызова вашего основного xsl, использования режимов name xslt, основного файла xslt, простого (пустого) статически определенного xslt-файла.
В основной xsl включите статический xsl-файл, который вызовет / загрузит все динамически включенные xslt. Основной xsl будет тогда работать в 2 режимах: нормальный режим (режим не указан), где он будет загружать файлы расширения xsl, включенные в него сам, и в статический xls, и обрабатывать любые входные файлы, или делать все, что когда-либо было полезно делать. Второй режим, режим препроцессора, будет предназначен для загрузки двоично указанных экземпляров / файлов xsl. Этот режим будет вызываться как этап препроцессора для основного цикла обработки. Поток процесса для основного xslt будет вызывать его с указанным режимом препроцессора, а затем вызывать его снова с указанным нормальным режимом обработки.
Советы по реализации:
Для каждого xlator определите файл xslt расширения n, ext_xsl_container, целью которого является включение любого расширения xslt.
например,
<xsl:stylesheet >
<!-- main xslt -->
<xsl:import href="../xsl/ext_xsl_container.xsl/>
<!--param: list of dynamically specified extension xsl -->
<xsl:param name="extXslUrlList"/>
<!--param:preprocessor mode flag, with default set to false -->
<xsl:param name="preProcModeLoadXslF" select="false()" type="xs:boolean"
<!-- param: path to the staticall included ext_xsl_container: with default value set -->
<xsl:param name="extXslContainerUrl" select="'../xsl/ext_xsl_container.xsl'"/>
<xsl:if test=" ($preProcModeLoadXslF=true())" >
<xsl:call-template name="loadDynamicXsl" mode="preprocess_load_xsl"
</xsl:if>
....
</xsl:stylesheet>
Таблица стилей ext_xslt_container будет включать любые расширения xslts. Он может динамически обновляться во время выполнения, редактируя его (как XML-документ), добавляя оператор включения для расширенных таблиц стилей xsl.
например,
<!-- ext xsl container : ext_xsl_container.xsl-->
<xsl:stylesheet
<xsl:include href="ext_xsl_container.xsl"/>
....
</xsl:stylesheet
Создайте небольшой шаблон, скажем template_load_ext_xsl, с назначенным режимом, скажем mode = "preprocess_load_xsl"
например,
<xsl:template name="loadDynamicXsl" mode="preprocess_load_xsl">
<!-- param: path to the staticall included ext_xsl_container-->
<xsl:param name="extXslContainerUrl"/>
<!--param: list of dynamically specified extension xsl -->
<xsl:param name="extXslUrlList"/>
<!-- step 1, [optional ] open the ext Xsl container file -->
<!-- step 2 [optional] clear contexts of the ext X -- >
<!-- step3 compile a list of include elements, one per each ext Xsl file -->
<!-- step 4 [optional] create a union of the include elements created with the content of the xsl container file : ie append content >
<!-- step 5 : write the union list of incudes to the ext XSL container file -->
<!-- DONE --->
</xsl:template>
Шаблон будет принимать в качестве аргументов имя ex_xsl_container и список расширенных файлов xsl (включая их пути).
Затем он откроет файл ext_xsl_container в виде XML-документа, добавит (параметры для добавления или очистки файла и добавления нового кода) для каждого расширения: xsl, сохранит файл и выйдет
Далее, когда вы запускаете основной xsl в обычном режиме выполнения, он включает шаблон loadDynamicXsl, который будет включать в себя файлы расширения xslt, указанные во время выполнения
Создайте простой скрипт-обертку (например, bash или shell-скрипт), который будет принимать аргументы для основного xslt, и опцию для запуска режима препроцессора. Сценарий просто вызовет основной xslt дважды, если включена опция режима препроцессора, и включается режим препроцессора при первом запуске, а затем второй вызов в обычном режиме