Skip to content

Instantly share code, notes, and snippets.

View joewiz's full-sized avatar

Joe Wicentowski joewiz

  • Arlington, Virginia
View GitHub Profile
@joewiz
joewiz / entities.xqm
Last active August 9, 2022 16:00
Look up HTML character entities and convert references to XML-compatible characters in XQuery
xquery version "3.1";
(:~ A module containing a lookup table, in the form of a map, for HTML entities
: that aren't defined in XML, and a function for converting HTML entities in
: strings to the appropriate characters. Look up characters via map lookup:
:
: $entities:entities?ograve?character => ò
:
: @author Joe Wicentowski
: @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML
@joewiz
joewiz / gaps-between-principals-appointments.xq
Created April 27, 2018 21:00
Gaps between appointments of Principal Officers
xquery version "3.1";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "html5";
declare option output:media-type "text/html";
let $title := "Gaps between appointments of Principal Officers"
let $min-gap := xs:dayTimeDuration("P30D")
let $positions := collection("/db/apps/pocom/positions-principals")/principal-position[not(id = ("ambassador-at-large", "career-ambassador"))]
@joewiz
joewiz / 01-generate-function-signatureTests.xq
Last active June 24, 2022 21:08 — forked from dizzzz/functionSignatureTests.xquery
A script to generate function-signature-tests for xquery functions in eXist-db
xquery version "3.1";
declare namespace fos="http://www.w3.org/xpath-functions/spec/namespace";
declare function local:writeHeader() as xs:string {
'
xquery version "3.1";
module namespace xqfunctions="http://exist-db.org/xquery/test/xqfunctions";
@joewiz
joewiz / README.md
Last active June 24, 2022 21:08
A report showing function signature mismatches in eXist's implementation of the XPath & XQuery functions & operators spec
@joewiz
joewiz / README.md
Last active January 9, 2018 17:26
Full text proximity search of Cyrillic text encoded in TEI XML using eXist-db

This gist was prompted by a question on the eXist-open mailing list. See http://markmail.org/message/zudf7qp4pqjx6xhi.

To run these files:

  • Download this gist as a .zip file
  • Uncompress the .zip file
  • Create collection /db/test in eXist
  • Upload the contents of the zip file into the /db/test collection
  • Reindex /db/test with xmldb:reindex("/db/test")
  • Run /db/test/test.xq
@joewiz
joewiz / 00-README.md
Last active January 29, 2022 00:45
Basic dynamic web pages, with XQuery and eXist

Basic dynamic web pages, with XQuery and eXist

This self-guided tutorial builds up from a simple "Hello, World!" exercise to a dynamic web page that responds to user input. It uses eXist-db and teaches the basic interface elements of the eXide XQuery IDE for developing XQuery-based applications in eXist.

eXist is a free, open source native XML database. It's a great tool for learning how to query, analyze, and transform your data. Among the various interfaces for working with eXist, one of the most convenient is eXide, a browser-based IDE (integrated development environment) for writing XQuery modules and developing XQuery-based applications on your own computer without installing any additional software. eXide comes pre-installed with eXist and has a number of useful features. We'll just cover the basics here. And once you have something you'd like to turn into a web page, eXist has a built-in web server, so you can develop full-fledged web applications by learning just a few additional functions and tec

@joewiz
joewiz / ideas-for-exist-db-app-org-repos.md
Last active December 2, 2017 00:16
Ideas for eXist-db org app repos

Ideas for eXist-db org app repos

Incomplete, draft notes toward a proposal for a consideration by the community during a future community call

Goals

  • Have a common set of best practices for maintaining and releasing quality eXist community apps
  • Help maintainers know what they should do
  • Help users know how to report problems, ask questions, and contribute
  • Help the community stay aware of releases
@joewiz
joewiz / an-introduction-to-recursion-in-xquery.md
Last active January 3, 2024 15:30
An introduction to recursion in XQuery

An introduction to recursion in XQuery

  • Created: Nov 28, 2017
  • Updated: Nov 29, 2017: Now covers transformation of XML documents

Recursion is a powerful programming technique, but the idea is simple: instead of performing a single operation, a function calls itself repeatedly to whittle through a larger task. In XQuery, recursion can be used to accomplish complex tasks on data that a plain FLWOR expression (which iterates through a sequence) cannot, such as transforming an entire XML document from one format into another, like TEI or DocBook into HTML, EPUB, LaTeX, or XSL-FO. Transforming a document is well-suited to recursion because each of the document's nodes may need to be examined and manipulated based on the node's type, name, and location in the document; and once a node has been processed, the transformation must continue processing the nodes' children and descendants until the deepest leaf node has been processed. But learning the technique of recursion is often hard for a beginning program

@joewiz
joewiz / enrich-dates-in-mixed-content.xq
Created November 21, 2017 18:38
Enrich dates in mixed content, with XQuery
xquery version "3.1";
(: Turning "December 7, 1941" into <date>December 7, 1941</date> isn't too hard, with XPath 3.0's
fn:analyze-string() function, but if the date string occurs in mixed text, such as:
<p>Pearl Harbor was attacked on <em>December</em> 7, 1941.</p>
and you want to preserve the existing element structure to return:
<p>Pearl Harbor was attacked on <date><em>December</em> 7, 1941</date>.</p>
it's quite a bit more challenging.
This query uses string processing to align the results of fn:string-analyze() with the input's
@joewiz
joewiz / get-latest-created-document.xq
Last active August 14, 2021 08:13
Get the most recently created document in an eXist collection, using XQuery
xquery version "3.1";
(: See discussion at http://markmail.org/message/hpu7toznx3fvdiei :)
import module namespace util="http://exist-db.org/xquery/util";
import module namespace xmldb="http://exist-db.org/xquery/xmldb";
declare function local:get-latest-created-document($collection-uri as xs:string) as map(*) {
if (xmldb:collection-available($collection-uri)) then
let $documents := xmldb:xcollection($collection-uri) ! util:document-name(.)