XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XQuery / PDF-Listendruck mit XQuery 3.0
![]() |
![]() |
➪ Die FO-Generierung von PDF-Dokumenten ist auch mit XQuery 3.0 problemlos möglich.
Das Beispiel bietet
xquery version '3.0';
declare namespace wg="https://www.wilfried-grupe.de/xquery/functions";
declare function wg:format-decimal ($a as xs:decimal) as xs:string
{
let
$ar as xs:string := format-number($a, '#,##0.00'),
$ar1 as xs:string := replace($ar, ',', '#'),
$ar2 as xs:string := replace($ar1, '\.', ','),
$ar3 as xs:string := replace($ar2, '#', '.')
return concat($ar3, ' Euro')
};
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master
margin-right="15mm"
margin-left="2cm"
margin-bottom="9mm"
margin-top="19mm"
page-width="297mm"
page-height="210mm"
master-name="DINA4Quer">
<fo:region-body />
</fo:simple-page-master>
</fo:layout-master-set>
{
for $o in /Orte/Ort return
<fo:page-sequence master-reference="DINA4Quer">
<fo:flow flow-name="xsl-region-body">
<fo:block background-color="lightgrey">{$o/name/text()}</fo:block>
{
for $m in $o/Mensch
let $ausg := xs:decimal(sum($m/Kauf/Gesamt/text()))
let $diff := xs:decimal($m/Gehalt/text() - $ausg)
order by ($diff) ascending
return
<fo:block>
<fo:block
margin-left="1cm"
space-before="3mm"
space-after="1mm">
{concat(
$m/vorname/text(), ' ',
$m/name/text(), ' verdient ',
wg:format-decimal($m/Gehalt/text()),
' Ausgaben: ',
wg:format-decimal($ausg)),
' Differenz: '}
<fo:inline color="{ if ($diff < 0)
then ('red')
else ('blue') }">{
wg:format-decimal($diff)}</fo:inline>
</fo:block>
<fo:table margin-left="3cm">
<fo:table-body>
<fo:table-row background-color="lightgrey">
<fo:table-cell>
<fo:block>Ware</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>Menge</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right">Einzelpreis</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right">Umsatz</fo:block>
</fo:table-cell>
</fo:table-row>
{
for $k in $m/Kauf
let $art := $k/bez/text()
group by $art
return
<fo:table-row>
<fo:table-cell>
<fo:block>{$art}</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>{sum(
for $kk in $k where $k/bez/text() = $art
return $kk/anzahl/text()
)}</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right">{
wg:format-decimal(
for $kk at $p in $k
where $k/bez/text() = $art
and $p=1 return $kk/preis/text())}</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right">{
wg:format-decimal(xs:decimal(sum(
for $kk in $k
where $k/bez/text() = $art
return $kk/Gesamt/text())))}</fo:block>
</fo:table-cell>
</fo:table-row>
}
</fo:table-body>
</fo:table>
</fo:block>
}
</fo:flow>
</fo:page-sequence>
}
</fo:root>
Das Resultat ist (nach zusätzlichem Start eines FO-Prozessors) ein PDF-Dokument, das so aussieht (Ausschnitt):
wg / 2. Mai 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de