xpath: содержит () группу ответов - PullRequest
4 голосов
/ 27 января 2010

Я пытаюсь изучить XPath, и у меня возникают проблемы с выполнением вложенного поиска (с использованием содержимого).

В частности, мне был задан следующий вопрос:

Существует список авторов и список книг, согласно следующему dtd:

<!ELEMENT db1 (book*, author*)>
<!ELEMENT book (title)>
<!ATTLIST book
    bid ID #REQUIRED
    authors IDREFS #REQUIRED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST author
    aid ID #REQUIRED
>

Напишите выражение XPath, которое возвращает количество авторов, написавших книги. Можно предположить, что нет двух идентификаторов авторов, которые содержат друг друга.

Я перепробовал много вещей, но получаю сообщение об ошибке "Слишком много предметов в контейнере". Я пытаюсь запустить что-то вроде этого:

//author/@aid[contains(//book/@authors/string(.),  string(.))]

Я использую следующий XML-файл в качестве примера:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE db1 SYSTEM "C:\blabla\db1.dtd">
<db1>
<book authors="a1 a3 a4" bid="b1">
<title>Book 1</title>
</book>
<book authors="a1 a2 a3" bid="b2">
<title>Book 2</title>
</book>
<book authors="a4" bid="b3">
<title>Book 3</title>
</book>
<author aid="a1"></author>
<author aid="a91"></author>
<author aid="a2"></author>
<author aid="a88"></author>
<author aid="a3"></author>
<author aid="a4"></author>
<author aid="a5"></author>
<author aid="a6"></author>

</db1>

Ожидаемый ответ должен быть

a1 a2 a3 a4

Любой совет?

Спасибо.

1 Ответ

2 голосов
/ 28 января 2010

Я нашел ответ, который искал. На самом деле это не так сложно, просто необходимо ознакомиться с функцией id в XPath.

Запрос XPAth для этого: count(id(//book/@authors))

Список авторов может быть представлен как id(//book/@authors). Обратите внимание, что этот xquery возвращает полный XML (а не только имена):

<author aid="a1"/>
<author aid="a2"/>
<author aid="a3"/>
<author aid="a4"/>

См. ссылка .

Функция contains в этом случае неприменима, но, к счастью, в этом нет необходимости.

Функция id выбирает элементы по их уникальному идентификатору. Когда аргумент для id имеет тип node-set, тогда результатом является объединение результата применения id к строковому значению каждого из узлов в аргументе-node-set. Когда аргумент id относится к какому-либо другому типу, аргумент преобразуется в строку, как если бы это вызывалось функцией string; строка разбивается на список токенов, разделенных пробелами (пробел - это любая последовательность символов, соответствующая производной S); В результате получается набор узлов, содержащий элементы в том же документе, что и узел контекста, которые имеют уникальный идентификатор, равный любому из токенов в списке.

...