Andrus schrieb am 17.03.2019 um 08:36:
> In Postgres 9.1.2 script below produces proper results:
>
> 1.34
> 5.56
>
> create temp table t(x xml, nsa text[][]) on commit drop;
> insert into t values(
> '<?xml version="1.0" encoding="UTF-8"?>
> <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
> <BkToCstmrStmt>
> <Stmt>
> <Ntry>
> <Amt Ccy="EUR">1.34</Amt>
> </Ntry>
> <Ntry>
> <Amt Ccy="EUR">5.56</Amt>
> </Ntry>
> </Stmt>
> </BkToCstmrStmt>
> </Document> '::xml,
> ARRAY[ARRAY['ns','urn:iso:std:iso:20022:tech:xsd:camt.053.001.02']]);
>
> SELECT
> (xpath('Amt/text()', x,nsa))[1]::text::numeric AS tasusumma
> FROM (
> SELECT unnest(xpath('/ns:Document/ns:BkToCstmrStmt/ns:Stmt/ns:Ntry',
> x,nsa)) as x,
> nsa
> FROM t
> ) Ntry
If you don't need compatibility with old versions, I would use XMLTABLE in Postgres 11
select x.*
from t,
xmltable(
XMLNAMESPACES(t.nsa[1][2] AS ns),
'/ns:Document/ns:BkToCstmrStmt/ns:Stmt/ns:Ntry'
passing t.x
columns tasusumma numeric path 'ns:Amt'
) as x;