Как обнаружить содержимое узлов XML с одинаковыми именами во время XSL «apply-template» - PullRequest
0 голосов
/ 05 августа 2010

Прошло много времени с тех пор, как я сделал 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 &lt;= $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

1 Ответ

2 голосов
/ 05 августа 2010

Вам нужно немного изменить фильтр.Следующее должно сделать трюк, так как он выберет все blog узлы, у которых есть дочерний элемент category, значение которого преобразуется в значения $BlogCategory:

category[translate(translate(., $uppercase, $lowercase),$specialchar,'') = $BlogCategory]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...