Подход к реализации xquery Паращенко Олег...
TRANSCRIPT
![Page 1: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/1.jpg)
Подход к реализации XQuery
Паращенко Олег
Санкт-Петербургский Государственный Университет
Обнинск, 2004
![Page 2: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/2.jpg)
XML<article id="hw"> <title>Hello</title> <para>Hello, <object>World</object>!</para></article>
article
/
title para@id
object“hw” “Hello” “Hello, ” “!”
“World”
![Page 3: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/3.jpg)
<usr> <bin> <cat/> <echo/> <xmllint/> … </bin> <lib> … </lib></usr>
Простой XPath
Похож на путь к файлу
/usr/bin/xmllint
![Page 4: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/4.jpg)
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/></AAA>
Простой XPath
Результат —множество узлов
/AAA/CCC
![Page 5: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/5.jpg)
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC></AAA>
//
Поиск по всемуподдереву
//DDD/BBB
![Page 6: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/6.jpg)
<AAA> <XXX> <DDD> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <XXX> <BBB/> <BBB/> <EEE/> <FFF/> </XXX> </CCC></AAA>
*
Любое имя
/AAA/*/*/BBB
![Page 7: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/7.jpg)
<AAA> <BBB id="b1"/> <BBB id="b2"/> <BBB name="bbb"/> <BBB/></AAA>
@
Атрибут
//BBB/@name
![Page 8: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/8.jpg)
Оси навигации
child::enamedescendant::enameparent::node()attribute::anameself::node()ancestorfollowing-siblingpreceding-sibling…
ename//ename..@aname.
![Page 9: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/9.jpg)
Фильтрация
<AAA> <BBB/> <BBB/> <BBB/> <BBB/></AAA>
<AAA> <BBB/> <BBB/> <BBB/> <BBB/></AAA>
(/AAA/BBB)[1] (/AAA/BBB)[last()]
![Page 10: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/10.jpg)
Фильтрация, функции
//bin[vim]
//openssh[.//sshd[@date<20040923]]
//bin/*[contains(name(), 'vi')]
![Page 11: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/11.jpg)
Запросы не для XPath
Обратные ссылки/... /xxx//... /yyy//... [..?xxx..?yyy...]
Создание элементов,переименование
![Page 12: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/12.jpg)
Пример XQuery
<example> <p> Here is a query. </p> <eg> doc("books.xml")//book[1]/title </eg> <p> Here is the result of the above query.</p> <eg>{ doc("books.xml")//book[1]/title }</eg></example>
<example> <p> Here is a query. </p> <eg> doc("books.xml")//book[1]/title </eg> <p> Here is the result of the above query.</p> <eg><title>TCP/IP Illustrated</title></eg></example>
![Page 13: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/13.jpg)
FLWOR (“flower”) expressions
for—let—where—order by—return
for $i in (1, 2, 3)return <tuple><i>{ $i }</i></tuple>
<tuple><i>1</i></tuple><tuple><i>2</i></tuple><tuple><i>3</i></tuple>
![Page 14: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/14.jpg)
define function toc($book-or-section as element()) as element()*{ for $section in $book-or-section/section return <section> { $section/@* , $section/title , toc($section) } </section>}<toc> { for $s in doc("xquery-book.xml")/book return toc($s) }</toc>
Функции
![Page 15: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/15.jpg)
Ресурсы
Спецификации
А.Валиков “Технология XSLT”
http://xmlhack.ru/
“XQuery from the Experts: A Guide to the W3C XML Query Language” by Howard Katz, D. D. Chamberlin
http://zvon.org/
![Page 16: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/16.jpg)
Подход к реализации XQuery
Паращенко Олег
Санкт-Петербургский Государственный Университет
Обнинск, 2004
(продолжение)
![Page 17: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/17.jpg)
XPath vs “вручную”get_elem("elemname[i]") vs/** * Returns child element at given position. Position can be * negative. In this case nodes are counting from end. * Last node position is '-1'. * @param node parent node * @param name name of node, null if not important * @param pos position of node starting from zero, can be negative */public static Element getChildElement (Element node, String name, int s) { // // Update position to be always positive. // boolean fromEnd = pos < 0; if (fromEnd) { pos = -(pos + 1); } // // Initialize // Node cur_node = fromEnd ? node.getLastChild(): node.getFirstChild(); int cur_pos = -1; // // Walk on children //
for (; cur_node != null; cur_node = (fromEnd ? cur_node.getPreviousSibling() : cur_node.getNextSibling ())) { // // Check that current node is of type 'element' // if (cur_node.getNodeType() != Node.ELEMENT_NODE) { continue; } // // Get element, check its name and position // Element cur_elem = (Element)cur_node; if ((name != null) && (! name.equals (cur_elem.getTagName()))) { continue; } cur_pos++; if (cur_pos == pos) { return cur_elem; } } // // If node was found, it was returned from inside loop // return null;}
![Page 18: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/18.jpg)
XPath vs “вручную”
наглядность
меньше кода – меньше ошибоки дополнительных расходов
менее 1 минутыvs
более 2 часов
![Page 19: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/19.jpg)
Программы с деревьями
findтекстовые процессорыкомпиляторы, интерпретаторы
встроенный xpath/xquery —“серебрянная пуля”
![Page 20: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/20.jpg)
Единая реализацияБиблиотеки C vs Java vs .NET vs …
Виртуальная машина● Реализация XQuery на удобном языке программирования● Байт-код ВМ● Интерпретатор ВМ
![Page 21: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/21.jpg)
Готовые реализации● CL-XML● SXML/SXPath/SXQuery
Удобный язык● Common Lisp или Scheme
![Page 22: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/22.jpg)
SXML
<article id="hw"> <title>Hello</title> <para>Hello, <object>World</object>!</para></article>
(*TOP* (article (@ (id "hw")) (title "Hello") (para "Hello, " (object "World") "!")))
S-exp:
XML:
![Page 23: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/23.jpg)
SXPath
((txpath "//TAF/VALID/@TRange/text()") document)
((sxpath '(// TAF VALID @ TRange *text*)) document)
((node-join (node-closure (node-typeof? 'TAF)) (select-kids (node-typeof? 'VALID)) (select-kids (node-typeof? '@)) (select-kids (node-typeof? 'TRange)) (select-kids (node-typeof? '*text*))) document)
![Page 24: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/24.jpg)
Части системы
SXQuery XQuery VM
макрораскрытие, компиляция
В программе:Интерпретатор ВМ
Привязка (bindings)
Парсер XML, XPath, XQuery
![Page 25: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/25.jpg)
Этапы развития
Сейчас – проверка идеи
v.0.1: Python AST
v.1.0: Docbook XSLT
![Page 26: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/26.jpg)
Похожие системы
Частично – любая реализацияXPath/XQuery
XSLTC от Oracle
![Page 27: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/27.jpg)
Оптимизация
(//ename)[1]
![Page 28: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/28.jpg)
ВМ как исходный код
e1 := _X(doc, “AAA//BBB/CCC”)e2 := _X(doc, “AAA//BBB/DDD”)
t1 := child(doc, “AAA”)t2 := descendant(t1, “BBB”)e1 := child(t2, “CCC”)t3 := child(doc, “AAA”)t4 := descendant(t3, “BBB”)e2 := child(t4, “DDD”)
t1 := child(doc, “AAA”)t2 := descendant(t1, “BBB”)e1 := child(t2, “CCC”)e2 := child(t2, “DDD”)
![Page 29: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/29.jpg)
Другие ВМ
Java VM
.NET VM
LLVM
![Page 30: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com](https://reader035.vdocuments.site/reader035/viewer/2022062314/56649e4a5503460f94b3df38/html5/thumbnails/30.jpg)
Подход к реализации XQuery
Паращенко Олег
Санкт-Петербургский Государственный Университет
Обнинск, 2004