Я ищу, чтобы узнать, как применить шаблон к 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="/">
)?
Любая помощь будет высоко оценена.
Антон Харрис
Я также нашел, как вызвать шаблон с параметром, указать корневой узел [(вызвать шаблон xslt с параметром)] (http://stackoverflow.com/questions/957029/call-xslt-template-with- параметр), но я не вижу, как применить это к вызываемым шаблонам. – AntonH
Не могли бы вы привести пример ввода с несколькими параметрами? И укажите, каков ожидаемый результат в таком случае? Обратите внимание, что обычно «параметр» означает что-то, предоставленное в таблицу стилей во время выполнения вызывающей процедурой, а не часть, включенную в обработанный XML, как часть данных. –
Параметр является буквально тегом ''. Другие параметры не влияют на то, какой шаблон вызывать. Другие параметры включают минимальное время работы ('<имя параметра =" min-hours "value =" 7 "/>'), максимальное рабочее время ('<имя параметра =" max-hours "value =" 9 "/>') , и другие. Я редактировал код для включения других параметров в пример. –
AntonH