XPath: сопоставить одного из нескольких детей - PullRequest
5 голосов
/ 06 июля 2011

У меня есть небольшое приложение, которое ищет ссылки на публикации. Цитаты приведены в XML, и я передаю параметры в XSLT через PHP для поиска по таким полям, как инструмент или автор. Структура выглядит так:

<publications>
    <paper>
        <authors>
            <author>James Smith</author>
            <author>Jane Doe</author>
        </authors>
        <year>2010</year>
        <title>Paper 1</title>
        (more children)
    </paper>
    (more papers)
</publications>

Когда я вызываю свой шаблон в XSLT, я использую предикат, чтобы сократить, какие документы показываются на основе критериев поиска. Так, например, если задан параметр $ author, я делаю:

<xsl:apply-templates select="paper[contains(authors/author, $author)]" />

Проблема: это работает для первого автора в "авторов", но игнорирует тех, кто после этого. Так что в приведенном выше примере поиск «Смит» вернул бы эту статью, но «Доу» ничего не возвращает.

Как мне отформатировать выражение, чтобы учитывать все"авторские" элементы?

1 Ответ

5 голосов
/ 06 июля 2011

Функция contains ожидает строку в качестве первого аргумента, а не набор узлов. С вашим выражением первый результат authors/author преобразуется в строку и затем передается в функцию.

Вместо этого используйте предикат, который независимо проверяет каждый из author узлов:

<xsl:apply-templates select="paper[authors/author[contains(., $author)]]" />

См., Например, это объяснение поведения Саксона:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...