source: cats/shared/urn.org.isocat.sloot/trunk/tools/xquery.dpml @ 3719

Last change on this file since 3719 was 3719, checked in by andmor, 11 years ago

Tunning cache

File size: 5.6 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<sequence>
3        <!-- convenience wrapper around active:xquery, which allows to have the XQuery as an XML literal so its wellformedness is easily checked -->
4        <literal assignment="debug" type="boolean">false</literal>
5        <if>
6                <cond method="identity">
7                        <request>
8                                <identifier>this:debug</identifier>
9                        </request>
10                </cond>
11                <then>
12                        <request>
13                                <verb>SINK</verb>
14                                <identifier>res:/debug-sloot/sloot.xquery.query.xml</identifier>
15                                <argument name="primary">arg:query</argument>
16                        </request>
17                </then>
18        </if>
19        <request assignment="query">
20                <identifier>active:xslt2</identifier>
21                <argument name="operand">arg:query</argument>
22                <argument name="operator">
23                        <literal type="xml">
24                                <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
25                                        <xsl:output method="text"/>
26                                        <xsl:param name="vararg"/>
27                                        <xsl:param name="debug"/>
28                                        <xsl:variable name="NL" select="system-property('line.separator')"/>
29                                        <xsl:template match="/">
30                                                <xsl:variable name="root" select="*"/>
31                                                <xsl:variable name="query">
32                                                        <!-- turn the namespaces in scope of the root element into 'declare namespace' statements -->
33                                                        <xsl:for-each
34                                                                select="in-scope-prefixes($root)[not(.=('xml','xs','xsi','fn','local'))]">
35                                                                <xsl:variable name="prefix" select="current()"/>
36                                                                <xsl:choose>
37                                                                        <xsl:when test="$prefix=''">
38                                                                                <xsl:text>declare default namespace "</xsl:text>
39                                                                                <xsl:value-of
40                                                                                        select="namespace-uri-for-prefix($prefix,$root)"/>
41                                                                                <xsl:text>";</xsl:text>
42                                                                                <xsl:value-of select="$NL"/>
43                                                                        </xsl:when>
44                                                                        <xsl:otherwise>
45                                                                                <xsl:text>declare namespace </xsl:text>
46                                                                                <xsl:value-of select="$prefix"/>
47                                                                                <xsl:text> = "</xsl:text>
48                                                                                <xsl:value-of
49                                                                                        select="namespace-uri-for-prefix($prefix,$root)"/>
50                                                                                <xsl:text>";</xsl:text>
51                                                                                <xsl:value-of select="$NL"/>
52                                                                        </xsl:otherwise>
53                                                                </xsl:choose>
54                                                        </xsl:for-each>
55                                                        <!-- turn the arguments into 'declare variable' statements -->
56                                                        <xsl:for-each
57                                                                select="$vararg/arguments/*[not(name()=('operand','operator'))]">
58                                                                <xsl:variable name="var" select="name()"/>
59                                                                <xsl:if test="$debug">
60                                                                        <xsl:message>DBG: variable name[<xsl:value-of select="$var"
61                                                                        />]</xsl:message>
62                                                                </xsl:if>
63
64                                                                <xsl:text>declare variable $</xsl:text>
65                                                                <xsl:value-of select="$var"/>
66                                                                <xsl:text> external;</xsl:text>
67                                                                <xsl:value-of select="$NL"/>
68                                                        </xsl:for-each>
69                                                        <xsl:apply-templates/>
70                                                </xsl:variable>
71                                                <xsl:if test="$debug">
72                                                        <xsl:message>DBG: xquery[<xsl:value-of select="$query"/>]</xsl:message>
73                                                </xsl:if>
74                                                <xsl:value-of select="$query"/>
75                                        </xsl:template>
76                                        <!-- turn an element node into an escaped XML string -->
77                                        <xsl:template match="*">
78                                                <xsl:text>&lt;</xsl:text>
79                                                <xsl:value-of select="name()"/>
80                                                <xsl:apply-templates select="@*"/>
81                                                <xsl:text>&gt;</xsl:text>
82                                                <xsl:apply-templates/>
83                                                <xsl:text>&lt;/</xsl:text>
84                                                <xsl:value-of select="name()"/>
85                                                <xsl:text>&gt;</xsl:text>
86                                        </xsl:template>
87                                        <!-- turn an attribute node into an escaped XML string -->
88                                        <xsl:template match="@*">
89                                                <xsl:text> </xsl:text>
90                                                <xsl:value-of select="name()"/>
91                                                <xsl:text>="</xsl:text>
92                                                <xsl:value-of
93                                                        select="replace(replace(replace(replace(replace(.,'&amp;','&amp;amp;'),''&apos;','&amp;apos;'),'&lt;','&amp;lt;'),'&gt;','&amp;gt;'),'&quot;','&amp;quot;')"/>
94                                                <xsl:text>"</xsl:text>
95                                        </xsl:template>
96                                        <!-- turn a text node into an escaped XML string -->
97                                        <xsl:template match="text()">
98                                                <xsl:value-of
99                                                        select="replace(replace(replace(replace(replace(.,'&amp;','&amp;amp;'),''&apos;','&amp;apos;'),'&lt;','&amp;lt;'),'&gt;','&amp;gt;'),'&quot;','&amp;quot;')"
100                                                />
101                                        </xsl:template>
102                                </xsl:stylesheet>
103                        </literal>
104                </argument>
105                <argument name="vararg">arg:arguments</argument>
106                <argument name="debug">this:debug</argument>
107        </request>
108        <request assignment="query">
109                <identifier>active:saxonSerialize</identifier>
110                <argument name="operand">this:query</argument>
111                <argument name="operator">
112                        <literal type="xml">
113                                <serialize>
114                                        <omit-declaration>yes</omit-declaration>
115                                        <method>text</method>
116                                        <mimeType>text/plain</mimeType>
117                                </serialize>
118                        </literal>
119                </argument>
120        </request>
121        <if>
122                <cond method="identity">
123                        <request>
124                                <identifier>this:debug</identifier>
125                        </request>
126                </cond>
127                <then>
128                        <request>
129                                <verb>SINK</verb>
130                                <identifier>res:/debug-sloot/sloot.xquery.query.xq</identifier>
131                                <argument name="primary">this:query</argument>
132                        </request>
133                </then>
134        </if>
135        <!-- XQuery returns the root element, while XSLT returns a document. We wrap the XQuery result in a Document using XSLT. -->
136        <request assignment="response">
137                <identifier>active:xslt2</identifier>
138                <argument name="operand">
139                        <request>
140                                <identifier>active:xquery</identifier>
141                                <argument name="operator">this:query</argument>
142                                <varargs/>
143                        </request>
144                </argument>
145                <argument name="operator">
146                        <literal type="xml">
147                                <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
148                                        <xsl:template match="*">
149                                                <xsl:copy-of select="."/>
150                                        </xsl:template>
151                                </xsl:stylesheet>
152                        </literal>
153                </argument>
154        </request>
155        <if>
156                <cond method="identity">
157                        <request>
158                                <identifier>this:debug</identifier>
159                        </request>
160                </cond>
161                <then>
162                        <request>
163                                <verb>SINK</verb>
164                                <identifier>res:/debug-sloot/sloot.xquery.result.xml</identifier>
165                                <argument name="primary">this:response</argument>
166                        </request>
167                </then>
168        </if>
169</sequence>
Note: See TracBrowser for help on using the repository browser.