joewiz
9/1/2015 - 3:00 PM

Strip diacritics, with XQuery

Strip diacritics, with XQuery

<result>
    <source>çéüå</source>
    <source-is-nfc-normalized>true</source-is-nfc-normalized>
    <nfd-normalized>çéüå</nfd-normalized>
    <stripped-of-combining-diacritical-marks>ceua</stripped-of-combining-diacritical-marks>
    <src-codepoints>231 233 252 229</src-codepoints>
    <nfd-codepoints>99 807 101 769 117 776 97 778</nfd-codepoints>
    <fin-codepoints>99 101 117 97</fin-codepoints>
</result>
xquery version "3.1";

declare function local:strip-diacritics($string as xs:string) as xs:string {
    let $normalized := normalize-unicode($string, 'NFD')
    let $stripped := replace($normalized, '\p{IsCombiningDiacriticalMarks}', '')
    return
        $stripped
};

declare function local:inspect-diacritics($string as xs:string) as element() {
    let $normalized := normalize-unicode($string, 'NFD')
    let $stripped := local:strip-diacritics($string)
    return
        <result>
            <source>{$string}</source>
            <source-is-nfc-normalized>{$string = normalize-unicode($string)}</source-is-nfc-normalized>
            <nfd-normalized>{$normalized}</nfd-normalized>
            <stripped-of-combining-diacritical-marks>{$stripped}</stripped-of-combining-diacritical-marks>
            <src-codepoints>{string-to-codepoints($string)}</src-codepoints>
            <nfd-codepoints>{string-to-codepoints($normalized)}</nfd-codepoints>
            <fin-codepoints>{string-to-codepoints($stripped)}</fin-codepoints>
        </result>
};


let $source := 'çéüå'
return 
    local:inspect-diacritics($source)