Как получить количество записей с помощью XQuery

У меня есть файл Library.xml, содержащий записи книг в виде

<?xml version="1.0" encoding="UTF-8"?>
<library>
    <book>
        <title>DBMS</title>
        <author>Korth</author>
        <publisher>Pragati</publisher>
        <price>500</price>
    </book>

    <book>
        <title>C Programming</title>
        <author>Balguruswami</author>
        <publisher>Vision</publisher>
        <price>1250</price>
    </book>

    <book>
        <title>DBMS</title>
        <author>Balguruswami</author>
        <publisher>Vision</publisher>
        <price>1300</price>
    </book>

    <book>
        <title>DBMS</title>
        <author>Ramakrishna</author>
        <publisher>Nirali</publisher>
        <price>350</price>
    </book>

    <book>
        <title>C++</title>
        <author>E Balguruswami</author>
        <publisher>Techmax</publisher>
        <price>350</price>
    </book>

</library>

Как получить количество книг по СУБД только с помощью XQuery - FLOWER? Я пробовал это:

let $books := (doc("LibraryXML.xml")/library/book)

    return <result>
    {
        for $x in $books
        where $x/title = "DBMS"
        return count($x)
    }
    </result>

И согласно library.xml ответ должен быть 3. Но я получаю это как:

<?xml version="1.0" encoding="UTF-8"?>
<result>1 1 1</result>

person Nandan Chitale    schedule 08.04.2020    source источник
comment
Вы, вероятно, исходите из фона SQL, где каждый запрос является SELECT, и поэтому предполагаете, что в XQuery каждый запрос является FLWOR. Но FLWOR нужен только для самых сложных запросов. Большинство простых запросов можно выполнить с помощью простого выражения XPath, такого как count(//title).   -  person Michael Kay    schedule 08.04.2020


Ответы (1)


Для этого в XQuery 3.0 нет необходимости в полном выражении FLWOR со всеми предложениями.

Проверьте это.

XQuery

let $library := doc("e:\Temp\LibraryXML.xml")/library/book[title='DBMS']
return <result>{count($library)}</result>

Выход

<result>3</result>
person Yitzhak Khabinsky    schedule 08.04.2020
comment
И еще проще, сделайте это в однострочном выражении, не позволяя переменной: <result>{count(doc("e:\Temp\LibraryXML.xml")/library/book[title='DBMS'])}</result> - person Mads Hansen; 08.04.2020
comment
Приятно слышать, что предложенное решение работает на вас. Пожалуйста, не забудьте отметить это как ответ - person Yitzhak Khabinsky; 17.04.2020