How to return/use the value of a nested counter?
Wednesday, 9 March 2022 · 4 messages · last reply 10 Mar 2022
BE
Ben Engbers9 Mar 2022 13:11 #
Hi,
I have a collection of 740 documents with the following structure:
<?xml version="1.0" encoding="utf-8"?>
<officiele-publicatie
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://technische-documentatie.oep.overheid.nl/schema/op-xsd-2012-1">
<metadata>
<meta name="OVERHEIDop.externMetadataRecord" scheme=""
content="https://zoek.officielebekendmakingen.nl/h-tk-20202021-102-2/metadata.xml"
/>
</metadata>
<handelingen>
<agendapunt>
<spreekbeurt nieuw="nee">
<tekst status="goed">
<al-groep>
<al>Allereerst hebben we het traditionele mondelinge
vragenuur. </al>
</al-groep>
</tekst>
</spreekbeurt>
<spreekbeurt nieuw="ja">
<tekst status="goed">
<al-groep>
<al>Voorzitter. Het was altijd al een eer om hier te
staan.</al>
</al-groep>
<al-groep>
<al>De vragen die ik ga stellen, gaan over stikstof.</al>
</al-groep>
<al-groep>
<al>We zijn allemaal 100 kilometer per uur gaan rijden,
maar er is nog geen gram ammoniak uit de veehouderij minder
uitgestoten.</al>
</al-groep>
</tekst>
</spreekbeurt>
</spreekbeurt>
<spreekbeurt nieuw="nee">
<tekst status="goed">
<al-groep>
<al>U heeft helaas maar één vraag, meneer Ephraim, als
Groep Van Haga.</al>
</al-groep>
<al-groep>
<al>Ik wil de minister bedanken voor haar beantwoording.</al>
</al-groep>
</tekst>
</spreekbeurt>
</agendapunt>
</handelingen>
</officiele-publicatie>I am trying to concatenate all the //<al> childs from <spreekbeurt> elements. Together with an ID that I construct from //meta/@content and a counter for <spreekbeurt>, I want this output:
20202021-102-2, 1, Allereerst ...
20202021-102-2, 2, Voorzitter... + De vragen ... + We zijn ... 20202021-102-2, 3, U heeft ... + Ik wil..
I expected that the following XQuery-statemnt would do it.
import module namespace functx = "http://www.functx.com";
for $Debat at $CountOuter in collection("Parliament")
(: where $CountOuter <= 3:)
let $debate-id := fn:analyze-string(
$Debat/officiele-publicatie/metadata/meta/@content,
"(\d{8}-\d*-\d*)")//fn:match/*:group[@nr="1"]/text()
order by $debate-id
for $Beurt at $CountInner in $Debat
let $tekst := $Beurt//spreekbeurt//al/text()
return($debate-id, $CountInner, $tekst)Instead it returns:
20202021-102-2, 1, Allereerst ...+ Voorzitter... + De vragen ... + We zijn ... + U heeft ... + Ik wil..
How can I use the value of $CountInner?
Ben
ZD
Zimmel, Daniel9 Mar 2022 17:45 #
Are you simply counting the wrong items?
It seems to me you wanted to count:
for $Beurt at $CountInner in $Debat//spreekbeurtDaniel
Quoted text · Ben Engbers · 71 lines
-----Ursprüngliche Nachricht----- Von: BaseX-Talk <basex-talk-bounces at mailman.uni-konstanz.de> Im Auftrag von Ben Engbers Gesendet: Mittwoch, 9. März 2022 13:11 An: Basex Mail-lijst <basex-talk at mailman.uni-konstanz.de> Betreff: [basex-talk] How to return/use the value of a nested counter? Hi, I have a collection of 740 documents with the following structure: <?xml version="1.0" encoding="utf-8"?> <officiele-publicatie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://technische-documentatie.oep.overheid.nl/schema/op-xsd-2012-1"> <metadata> <meta name="OVERHEIDop.externMetadataRecord" scheme="" content="https://zoek.officielebekendmakingen.nl/h-tk-20202021-102-2/metadata.xml" /> </metadata> <handelingen> <agendapunt> <spreekbeurt nieuw="nee"> <tekst status="goed"> <al-groep> <al>Allereerst hebben we het traditionele mondelinge vragenuur. </al> </al-groep> </tekst> </spreekbeurt> <spreekbeurt nieuw="ja"> <tekst status="goed"> <al-groep> <al>Voorzitter. Het was altijd al een eer om hier te staan.</al> </al-groep> <al-groep> <al>De vragen die ik ga stellen, gaan over stikstof.</al> </al-groep> <al-groep> <al>We zijn allemaal 100 kilometer per uur gaan rijden, maar er is nog geen gram ammoniak uit de veehouderij minder uitgestoten.</al> </al-groep> </tekst> </spreekbeurt> </spreekbeurt> <spreekbeurt nieuw="nee"> <tekst status="goed"> <al-groep> <al>U heeft helaas maar één vraag, meneer Ephraim, als Groep Van Haga.</al> </al-groep> <al-groep> <al>Ik wil de minister bedanken voor haar beantwoording.</al> </al-groep> </tekst> </spreekbeurt> </agendapunt> </handelingen> </officiele-publicatie> I am trying to concatenate all the //<al> childs from <spreekbeurt> elements. Together with an ID that I construct from //meta/@content and a counter for <spreekbeurt>, I want this output: 20202021-102-2, 1, Allereerst ... 20202021-102-2, 2, Voorzitter... + De vragen ... + We zijn ... 20202021-102-2, 3, U heeft ... + Ik wil.. I expected that the following XQuery-statemnt would do it. import module namespace functx = "http://www.functx.com"; for $Debat at $CountOuter in collection("Parliament") (: where $CountOuter <= 3:) let $debate-id := fn:analyze-string( $Debat/officiele-publicatie/metadata/meta/@content, "(\d{8}-\d*-\d*)")//fn:match/*:group[@nr="1"]/text() order by $debate-id for $Beurt at $CountInner in $Debat let $tekst := $Beurt//spreekbeurt//al/text() return($debate-id, $CountInner, $tekst) Instead it returns: 20202021-102-2, 1, Allereerst ...+ Voorzitter... + De vragen ... + We zijn ... + U heeft ... + Ik wil.. How can I use the value of $CountInner? Ben
BE
Ben Engbers9 Mar 2022 22:46 #
Hi
for $Debat at $CountOuter in collection("Parl_Test")
(: where $CountOuter <= 3:)
let $debate-id := fn:analyze-string(
$Debat/officiele-publicatie/metadata/meta/@content,
"(\d{8}-\d*-\d*)")//fn:match/*:group[@nr="1"]/text()
order by $debate-id
for $Beurt at $CountInner in $Debat//spreekbeurt
let $tekst := $Beurt//al/text()
return($debate-id, $CountInner, $tekst):-)
Ben
Quoted text · Zimmel, Daniel · 8 lines
Op 09-03-2022 om 17:45 schreef Zimmel, Daniel: > Are you simply counting the wrong items? > > It seems to me you wanted to count: > > for $Beurt at $CountInner in $Debat//spreekbeurt > > Daniel
BE
Ben Engbers10 Mar 2022 12:26 #
Hi,
In the GUI, I couldn't see if all the //al/text() elements were really displayed as one (1) concatenated objected or just repeated. Only after importing the result to an R-dataframe, I saw that //al/text() was displayed as separate elements.
Adding '
fn:string-join($Beurt//al/text(), " ")' to the statement did the trick.
Benfor $Debat in collection("Parl_Test")
let $debate-id := fn:analyze-string(
$Debat/officiele-publicatie/metadata/meta/@content,
"(\\d{8}-\\d*-\\d*)")//fn:match/*:group[@nr="1"]/text()
for $Beurt at $CountInner in $Debat//spreekbeurt
let $tekst := fn:string-join($Beurt//al/text(), " ")
order by $debate-id
return($debate-id, $CountInner, $tekst)Quoted text · Ben Engbers · 23 lines
Op 09-03-2022 om 22:46 schreef Ben Engbers: > Hi > > for $Debat at $CountOuter in collection("Parl_Test") > (: where $CountOuter <= 3:) > let $debate-id := fn:analyze-string( > $Debat/officiele-publicatie/metadata/meta/@content, > "(\d{8}-\d*-\d*)")//fn:match/*:group[@nr="1"]/text() > order by $debate-id > for $Beurt at $CountInner in $Debat//spreekbeurt > let $tekst := $Beurt//al/text() > return($debate-id, $CountInner, $tekst) > > :-) > > Ben > Op 09-03-2022 om 17:45 schreef Zimmel, Daniel: >> Are you simply counting the wrong items? >> >> It seems to me you wanted to count: >> for $Beurt at $CountInner in $Debat//spreekbeurt >> >> Daniel
Written for BaseX 9.6. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery