У меня есть проблема.
У меня есть XML-файл, который содержит информацию приблизительно 100 курсов.
У меня есть файл XSL, который приятно отображает список 100 курсов.
Но что, если я хочу только отобразить 1 курс. Я могу передать параметр файлу XSLT, чтобы сказать этому только отображать "ENGL 100"?
XML выглядит примерно так:
<document>
<menu>
<item>
<name>MTH 300</name>
<brief>Mathematics Skill Development</brief>
<description>A course in the fundamentals of ...</description>
</item>
<item>
<name>MTH 301</name>
<brief>Basic Algebra</brief>
<description>An introduction to algebra, ...</description>
</item>
...
Я знаю, что мог записать файл XSLT, названный "eng100.xsl", чтобы циклично выполниться через XML и отобразить только ENG 100, но я не хочу должным быть писать десятки этих файлов.
XML является динамичным, и я могу управлять им. Я хочу, чтобы файл XSLT был статичен и никогда не изменялся.
Там какой-либо путь состоит в том, чтобы передать параметры в XSLT?
Вы можете передавать параметры в XSLT, как это делается, зависит от вашего процессора XSLT, но обычно как дополнительные аргументы команды, если это процессор командной строки.
Вы объявляете параметры с помощью
<xsl:param name="courseName" select"initialValue"/>
Затем вы можете проверить этот параметр в XSLT и вызвать другой шаблон в зависимости от его значения. Например, если параметр пуст, то вызывается текущий шаблон, который обрабатывает все элементы, в противном случае вызывается шаблон, который обрабатывает элементы только тогда, когда имя элемента равно значению параметра. Это можно сделать с помощью теста
<xsl:template match="item">
<xsl:if test="$courseName=name(./name)">
<xsl:call-template name="yourOriginalTemplate"/>
</xsl:if>
</xsl:template>
Но, фильтруя и форматируя, вы смешиваете две проблемы в одном файле. Я бы отделил отбор XML-элементов от форматирования - заведите для этого два xslt-файла и запускайте их как конвейер.