2013-12-16 3 views
0

Я ищу, чтобы узнать, как применить шаблон к XML-файлу на основе параметра в XML-файле.Как применить или импортировать шаблон XSLT на основе параметра

XML-файл имеет следующий формат:

<workfile> 
    <query> 
     <some-info-1/> 
     <some-info-2/> 
     <some-info-3/> 
     <some-info-4/> 
     <some-info-5/> 
     <some-info-6/> 
     <some-info-7/> 
     <parameter name="hours-min" value="7" /> 
     <parameter name="hours-max" value="9" /> 
     <parameter name="output-type" value="type-1" /> 
    </query> 
</workfile> 

XML-файл генерируется другой программой, и требует определенного формата вывода в зависимости от значения параметра «выход типа». Этот параметр может возникать несколько раз, если результаты должны быть сгенерированы для нескольких выходов одновременно, поэтому потребуется цикл for-each.

Редактировать Вот пример с несколькими параметрами вывода типа:

<workfile> 
    <query> 
     <some-info-1/> 
     <some-info-2/> 
     <some-info-3/> 
     <parameter name="hours-min" value="7" /> 
     <parameter name="hours-max" value="9" /> 
     <parameter name="output-type" value="type-1" /> 
     <parameter name="output-type" value="type-2" /> 
     <parameter name="output-type" value="type-3" /> 
    </query> 
</workfile> 

Я хотел бы создать основной файл шаблона generate-main.xsl и, в файле, импорт/включить другие файлы шаблонов (генерировать -type-1.xsl, generate-type-2.xsl и т. д.). Каждый из этих шаблонов должен работать от корневого узла (/). Но у меня возникают проблемы с пониманием того, как это сделать.

Это generate-main.xsl основание я писал:

<xsl:template match="/"> 
    <results> 
     <xsl:for-each select="/workfile/query/parameter[@name='output-type']"> 
      <xsl:variable name="outputType" select="./@value" /> 
      <xsl:choose> 
       <xsl:when test="$outputType='type-1'"> 
        <xsl:call-template name="type-1" /> 
       </xsl:when> 
       <xsl:when test="$outputType='type-2'"> 
        <xsl:call-template name="type-2" /> 
       </xsl:when> 
       <xsl:when test="$outputType='type-3'"> 
        <xsl:call-template name="type-3" /> 
       </xsl:when> 
       <xsl:when test="$outputType='type-4'"> 
        <xsl:call-template name="type-4" /> 
       </xsl:when> 
       <xsl:when test="$outputType='type-5'"> 
        <xsl:call-template name="type-5" /> 
       </xsl:when> 
       <xsl:otherwise> 
       </xsl:otherwise> 
      </xsl:choose> 
      </xsl:for-each> 
     </results> 
    </xsl:template> 

    <xsl:template name="type-1"> 
     <!-- TO DO --> 
    </xsl:template> 

    <xsl:template name="type-2"> 
     <!-- TO DO --> 
    </xsl:template> 

    <xsl:template name="type-3"> 
     <!-- TO DO --> 
    </xsl:template> 

    <xsl:template name="type-4"> 
     <!-- TO DO --> 
    </xsl:template> 

    <xsl:template name="type-5"> 
     <!-- TO DO --> 
    </xsl:template> 
</xsl:stylesheet> 

я сделал исследования по этому вопросу. Например, Dimitre Novatchev ответил на этот вопрос, когда шаблоны находятся в одном и том же XSL-файле (Applying different XSLT template depending on a parameter), но я не нашел, как это сделать с импортированными XSL-файлами, которые работают с корневым узлом.

Так что мои вопросы:
1) Можно ли включить или шаблоны импорта в основной файл XSL и вызывать только один в зависимости от параметра (например, играя включаемые в вызываемом шаблоне)
? 2) Возможно ли, что все включенные шаблоны работают с корневым узлом (и, я бы предположил, начните с <template match="/">)?

Любая помощь будет высоко оценена.

Антон Харрис

+0

Я также нашел, как вызвать шаблон с параметром, указать корневой узел [(вызвать шаблон xslt с параметром)] (http://stackoverflow.com/questions/957029/call-xslt-template-with- параметр), но я не вижу, как применить это к вызываемым шаблонам. – AntonH

+0

Не могли бы вы привести пример ввода с несколькими параметрами? И укажите, каков ожидаемый результат в таком случае? Обратите внимание, что обычно «параметр» означает что-то, предоставленное в таблицу стилей во время выполнения вызывающей процедурой, а не часть, включенную в обработанный XML, как часть данных. –

+0

Параметр является буквально тегом ''. Другие параметры не влияют на то, какой шаблон вызывать. Другие параметры включают минимальное время работы ('<имя параметра =" min-hours "value =" 7 "/>'), максимальное рабочее время ('<имя параметра =" max-hours "value =" 9 "/>') , и другие. Я редактировал код для включения других параметров в пример. – AntonH

ответ

2

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

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

<xsl:for-each select="/workfile/query/parameter[@name='output-type']"> 
      <xsl:variable name="outputType" select="./@value" /> 
      <xsl:choose> 
       <xsl:when test="$outputType='type-1'"> 
        <xsl:call-template name="type-1" /> 
       </xsl:when> 

<xsl:template name="type-1"> 
    <!-- TO DO --> 
</xsl:template> 

(что очень не-XSLT-как, и многословным)

с

<xsl:apply-templates select="/workfile/query/parameter[@name='output-type']"/> 

<xsl:template match="parameter[@name='output-type'][@value='type1']"> 
<!-- TO DO --> 
</xsl:template> 

т.д.

Почему вы хотите, чтобы все включенные шаблоны в начать с корневого узла?

+0

Благодарим вас за ответ. Этот XSLT-файл является заключительным этапом проекта, который включает файлы XSLT, применяемые к исходному XML-файлу, и вызывает веб-службы. Результаты (заданные параметром «output-type») зависят как от начальной информации запроса (например, сумма часов может быть вне диапазона, с максимальными и минимальными часами, указанными в узле , и требуют генерации сообщений об ошибках) , а также информацию, полученную перед выполнением этого файла XSLT. Надеюсь, что это ответ на ваш вопрос. Вот почему так называемые templated требуют доступа к корневому узлу. – AntonH

+0

Кроме того, я хочу включить/импортировать, потому что мы два человека, работающие над проектом, и чтобы избежать много копий/вставки кода. (Отдельный комментарий, потому что предыдущий комментарий был бы слишком длинным в противном случае.) – AntonH

+0

Просмотрев код и подумав о ответе на ваш последний вопрос, я считаю, что я слишком усложнял то, что хотел. Таким образом, я буду сокращаться на раздувании и должен иметь возможность достичь результата. Я буду правильно отмечать этот ответ, поскольку он привел меня к тому, что я хотел. – AntonH

-1

Я думаю, что есть два вопроса:

  1. Можете ли вы сделать то, что вы пытаетесь сделать?
  2. Должны ли вы делать то, что вы пытаетесь сделать?

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

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

Ответ на второй вопрос сложнее, потому что описание слишком абстрактно. Я подозреваю, что вы можете получить больше пробега из одного «выходного» шаблона, который называется несколько раз - каждый раз с другим параметром. Затем используйте choose элемент внутри шаблон для получения соответствующего вывода.

+0

Не могли бы вы рассказать мне, как описание слишком абстрактно, чтобы я мог предоставить дополнительные сведения? – AntonH

+0

@AntonH: Я имею в виду, что мы не знаем, что делают разные шаблоны. Мы даже не знаем, какие данные находятся в разделе «some-info». Это вопрос стратегии, и трудно сказать, какая лучшая стратегия - когда мы действительно не знаем, с чем имеем дело. –

+0

Я не вижу, как знать, что делают шаблоны, а также указать, какая другая информация находится в узле , поможет, поскольку шаблоны * сами по себе * работают, а другая информация () не учитывается для мой вопрос. Мой вопрос касается вызова шаблонов, включенных в другие файлы. – AntonH

Смежные вопросы