In this exaple we will achieve the same result as in previous one with XQuery
but we will use a different tool – relpipe-in-xmltable
.
This approach differs from XQery one in several aspects:
This is the (shortened) structure of our XML input:
<?xml version="1.0" encoding="utf8"?>
<atom:feed xmlns="http://www.w3.org/1999/xhtml" xmlns:atom="http://www.w3.org/2005/Atom">
<atom:title>Frantovo.cz – články</atom:title>
<atom:subtitle>Blog nejen o svobodném softwaru, GNU/Linuxu, Javě, XML, politice, ekonomii, filosofii</atom:subtitle>
<atom:id>urn:uuid:d61ea960-3b36-11e3-bdb9-3085a98fdb88</atom:id>
<atom:link rel="self" href="https://blog.frantovo.cz//agregace/c/"/>
<atom:link href="https://blog.frantovo.cz"/>
<atom:updated>2019-07-12T08:12:00Z</atom:updated>
<atom:author>
<atom:name>František Kučera</atom:name>
</atom:author>
<atom:entry>
<atom:title>OpenPOWER – Blackbird – první spuštění</atom:title>
<atom:link href="https://blog.frantovo.cz/c/375/OpenPOWER%20%E2%80%93%20Blackbird%20%E2%80%93%20prvn%C3%AD%20spu%C5%A1t%C4%9Bn%C3%AD"/>
<atom:id>https://blog.frantovo.cz/c/375/</atom:id>
<atom:updated>2019-07-12T08:12:00Z</atom:updated>
<atom:published>2019-07-12T08:12:00Z</atom:published>
<atom:summary type="xhtml">
<div>
<div>
<p>Po včerejším <em>retro</em> článku tu máme <em>návrat do budoucnosti</em> – ze které se ale naštěstí už stává současnost. Zatím jsem udělal jen pár fotek… Ohledně motivace a smyslu doporučuji si přečíst <a href="/c/368/HiFive1%20%E2%80%93%20deska%20s%C2%A0otev%C5%99en%C3%BDm%20%C4%8Dipem%20RISC-V">HiFive1 – deska s otevřeným čipem RISC-V</a>.</p>
<p class="obrázek">
<a href="/s/1423/IMG_2329.JPG">
<img src="/s/1424/nahled_IMG_2329.JPG" alt="OpenPOWER CPU a deska Blackbird" title="OpenPOWER CPU a deska Blackbird"/>
</a>
</p>
</div>
</div>
</atom:summary>
</atom:entry>
<atom:entry>
<atom:title>Siemens Nixdorf: ComfoDesk (1990)</atom:title>
<atom:link href="https://blog.frantovo.cz/c/374/Siemens%20Nixdorf%3A%20ComfoDesk%20%281990%29"/>
<atom:id>https://blog.frantovo.cz/c/374/</atom:id>
<atom:updated>2019-07-11T20:08:59Z</atom:updated>
<atom:published>2019-07-11T17:17:24Z</atom:published>
<atom:summary type="xhtml">
<div>
<div>
<p>Objevil jsem doma staré diskety se softwarem ComfoDesk od firmy Siemens Nixdorf. Zajímalo mne, jestli budou ještě fungovat a jestli je ten software tak hrozný jako tehdy (vzpomínky na to nejsou moc dobré – nikdo u nás s tím neuměl pracovat a nakonec jsme museli přeinstalovat systém, abychom se ComfoDesku zbavili). Navíc je na internetu minimum zmínek o tomto softwaru, takže jsem se rozhodl ho alespoň trochu zdokumentovat pro příští generace.</p>
<p class="obrázek">
<a href="/s/1435/comfodesk-disketa-2-IMG_2461.jpeg">
<img src="/s/1436/nahled_comfodesk-disketa-2-IMG_2461.jpeg" alt="Siemens Nixdorf: ComfoDesk – diskety" title="Siemens Nixdorf: ComfoDesk – diskety"/>
</a>
</p>
</div>
</div>
</atom:summary>
</atom:entry>
<atom:entry>
<atom:title>Opravujeme myš: výměna spínačů</atom:title>
<atom:link href="https://blog.frantovo.cz/c/373/Opravujeme%20my%C5%A1%3A%20v%C3%BDm%C4%9Bna%20sp%C3%ADna%C4%8D%C5%AF"/>
<atom:id>https://blog.frantovo.cz/c/373/</atom:id>
<atom:updated>2019-07-04T22:39:39Z</atom:updated>
<atom:published>2019-07-04T18:12:02Z</atom:published>
<atom:summary type="xhtml">
<div>
<div>
<p>Po letech dobré služby mne začaly zlobit myši. A protože nerad vyhazuji věci a byly to kvalitní kousky hardwaru, pustil jsem se do opravy.</p>
<p class="obrázek">
<a href="/s/1388/logitech_trackman_marble_IMG_2189.JPG">
<img src="/s/1389/nahled_logitech_trackman_marble_IMG_2189.JPG" alt="myš resp. trackball Logitech TrackMan Marble (T-BC21)" title="myš resp. trackball Logitech TrackMan Marble (T-BC21)"/>
</a>
</p>
</div>
</div>
</atom:summary>
</atom:entry>
</atom:feed>
This pipeline will download the XML data and transform it to two relations:
#!/bin/bash
get_atom() {
wget --quiet --output-document - https://blog.frantovo.cz/agregace/c/?p=10
# wget --quiet --output-document - https://blog.frantovo.cz/agregace/k/
# cat atom.xml
}
get_atom \
| relpipe-in-xmltable \
--namespace "a" "http://www.w3.org/2005/Atom" \
--relation "/a:feed/a:title" --name-is-xpath \
--records "//a:entry" \
--attribute "published" string "a:published" \
--attribute "title" string "a:title" \
--attribute "url" string "a:link/@href" \
--relation "metadata" \
--records "." \
--attribute "id" string "a:id" \
--attribute "subtitle" string "a:subtitle" \
| relpipe-out-tabular
The first one contains individual entries and the second one contains the common header:
Frantovo.cz – články:
╭──────────────────────┬──────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ published (string) │ title (string) │ url (string) │
├──────────────────────┼──────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 2019-07-12T08:12:00Z │ OpenPOWER – Blackbird – první spuštění │ https://blog.frantovo.cz/c/375/OpenPOWER%20%E2%80%93%20Blackbird%20%E2%80%93%20prvn%C3%AD%20spu%C5%A1t%C4%9Bn%C3%AD │
│ 2019-07-11T17:17:24Z │ Siemens Nixdorf: ComfoDesk (1990) │ https://blog.frantovo.cz/c/374/Siemens%20Nixdorf%3A%20ComfoDesk%20%281990%29 │
│ 2019-07-04T18:12:02Z │ Opravujeme myš: výměna spínačů │ https://blog.frantovo.cz/c/373/Opravujeme%20my%C5%A1%3A%20v%C3%BDm%C4%9Bna%20sp%C3%ADna%C4%8D%C5%AF │
│ 2019-06-04T16:32:08Z │ Java a unixové doménové sokety, FD, systemd a xinetd │ https://blog.frantovo.cz/c/372/Java%20a%C2%A0unixov%C3%A9%20dom%C3%A9nov%C3%A9%20sokety%2C%20FD%2C%20systemd%20a%C2%A0xinetd │
│ 2019-04-26T19:48:00Z │ Zálohujeme internet: Zdrojové kódy │ https://blog.frantovo.cz/c/371/Z%C3%A1lohujeme%20internet%3A%20Zdrojov%C3%A9%20k%C3%B3dy │
│ 2018-12-24T13:37:24Z │ GNU Bash: Vánoční tipy │ https://blog.frantovo.cz/c/370/GNU%20Bash%3A%20V%C3%A1no%C4%8Dn%C3%AD%20tipy │
│ 2018-08-04T23:23:00Z │ HiFive1 – deska s otevřeným čipem RISC-V │ https://blog.frantovo.cz/c/368/HiFive1%20%E2%80%93%20deska%20s%C2%A0otev%C5%99en%C3%BDm%20%C4%8Dipem%20RISC-V │
│ 2018-06-30T13:37:08Z │ The Things Network – LoRaWAN – IoT │ https://blog.frantovo.cz/c/366/The%20Things%20Network%20%E2%80%93%20LoRaWAN%20%E2%80%93%C2%A0IoT │
│ 2018-03-31T19:48:00Z │ Roland Rubix44 – externí zvuková karta │ https://blog.frantovo.cz/c/365/Roland%20Rubix44%20%E2%80%93%20extern%C3%AD%20zvukov%C3%A1%20karta │
│ 2017-11-25T20:26:49Z │ Přepisování parametrů příkazové řádky │ https://blog.frantovo.cz/c/362/P%C5%99episov%C3%A1n%C3%AD%20parametr%C5%AF%20p%C5%99%C3%ADkazov%C3%A9%20%C5%99%C3%A1dky │
╰──────────────────────┴──────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Record count: 10
metadata:
╭───────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────╮
│ id (string) │ subtitle (string) │
├───────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┤
│ urn:uuid:d61ea960-3b36-11e3-bdb9-3085a98fdb88 │ Blog nejen o svobodném softwaru, GNU/Linuxu, Javě, XML, politice, ekonomii, filosofii │
╰───────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────╯
Record count: 1
This example shows how to work with namespaces and how to generate multiple relations from a single XML input. It also shows that the name of the relation do not have to be a literal but might be derived from the input document.
If we add the id
attribute to the entries table, we can aggregate entries from various sources and still be able to JOIN them with their metadata.
Relational pipes, open standard and free software © 2018-2022 GlobalCode