Прошло много времени с тех пор, как я сделал XSL, так что простите, если это немного сбивает с толку.
У меня есть файл XML, который мне нужно преобразовать с помощью XSL. Все работает хорошо, пока я не попытаюсь обнаружить «категорию», потому что для каждого элемента есть несколько узлов «категории».
Часть XML-файла:
<ROOT>
<blog day="20" id="4" live="201007200947" month="7" monthname="July" year="2010">
<blog_date><![CDATA[2010-07-20 09:47:00.0]]></blog_date>
<filepath><![CDATA[2010/20100720_4.htm]]></filepath>
<title><![CDATA[Blog title 1]]></title>
<category><![CDATA[Testing]]></category>
<category><![CDATA[Training]]></category>
<author_id><![CDATA[146]]></author_id>
<keywords/>
<summary><![CDATA[New British Gas Smart Metering recruits Paul Williams and Alex Egan give their first impressions.]]></summary>
</blog>
Пример файла XSL
<xsl:template match="//ROOT">
<xsl:apply-templates select="//blog
[@live <= $ThisDate]
[not($AuthorId) or (author_id = $AuthorId)]
[not($BlogYear) or (not($BlogMonth) or (@month = $BlogMonth and @year = $BlogYear))]
[not($BlogCategory) or (translate(translate(category, $uppercase, $lowercase),$specialchar,'') = $BlogCategory)]
">
<xsl:sort value="blog_date" order="descending"/>
</xsl:apply-templates>
$ BlogCategory отправляется в URL и удаляет все специальные символы и пробелы (отсюда "translate" в "category").
Если я отфильтрую XML по категории «Тестирование», то он будет работать нормально, но если я отсортирую по категории «Обучение», он не вернет никаких значений. Я знаю, что это потому, что он смотрит только на первый узел с именем «категория», но кто-нибудь может предложить исправление?
В прошлом я пробовал цикл for-each, и он работает, но не идеален, поскольку position () всегда равен 1, поэтому добавление навигации по страницам в файле xsl невозможно.
В идеале я хотел бы, чтобы исправление могло остаться в пределах шаблона применения.
Я использую XSLT 2.0.
Спасибо,
Kate