/[cvs]/nfo/perl/libs/XML/XUpdate/xupdate2xsl.xml
ViewVC logotype

Annotation of /nfo/perl/libs/XML/XUpdate/xupdate2xsl.xml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (hide annotations)
Wed May 7 12:41:17 2003 UTC (21 years ago) by joko
Branch: MAIN
Changes since 1.4: +31 -18 lines
File MIME type: text/xml
+ alpha: 2.9 Variables and Values of Variables

1 joko 1.1 <?xml version="1.0" encoding="ISO-8859-1"?>
2    
3     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
4    
5 joko 1.3 <!--
6    
7 joko 1.4 xupdate2xsl: Translate XML document from namespace 'xupdate' to 'xsl'.
8    
9     Purpose of this XML Stylesheet is to implement a set of templates
10     to translate XUpdate lingo into an intermediate xslt stylesheet
11     which actually performs the update to the original xml document
12     in a second step.
13    
14     The required glue code - written in Perl - is available in module
15     XML::XUpdate::XSLT. Please have a look at this in order to write
16     code to use this stylesheet from other language bindings.
17    
18     Please have a look at the XUpdate specs and associated resources:
19     Requirements: http://www.xmldb.org/xupdate/xupdate-req.html
20     Working Draft: http://www.xmldb.org/xupdate/xupdate-wd.html
21    
22     ChangeLog:
23     2003-04-30: first alpha
24     2003-05-01: works: xupdate:insert-after (elements/attributes)
25     2003-05-06: works: xupdate:insert-before (elements/attributes)
26    
27 joko 1.1 -->
28    
29     <xsl:output method="xml" />
30    
31     <!-- 1. This is the passthru logic (copy all untouched nodes). -->
32     <xsl:template name="passthru"><xsl:copy><xsl:apply-templates /></xsl:copy></xsl:template>
33     <!-- activate this -->
34     <xsl:template match="*"><xsl:call-template name="passthru" /></xsl:template>
35     <!-- override some builtin rules: see http://www.w3.org/TR/xslt#built-in-rule -->
36     <xsl:template match="comment()"><xsl:call-template name="passthru" /></xsl:template>
37    
38 joko 1.2
39 joko 1.1 <!-- 2. This is the translation part: XUpdate becomes XSLT -->
40    
41 joko 1.2 <!-- lib -->
42     <!-- This node "encapsulates" common core infrastructure. -->
43 joko 1.1 <xsl:template match="xupdate:modifications">
44    
45 joko 1.2 <!-- <xsl:template name="identity_template_rule"> -->
46     <xsl:element name="xsl:template">
47     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
48    
49     <!-- An "identity template rule" - original version by Mike Kay, Software AG -->
50     <!-- Please visit [http://p2p.wrox.com/archive/xslt/2001-06/98.asp] -->
51     <!-- Translated to "self hosting xsl": Andreas Motl, andreas.motl@ilo.de -->
52     <!-- FIXME: Could this be used to replace passthru-logic at 1. ? -->
53     <xsl:element name="xsl:copy">
54     <xsl:element name="xsl:copy-of">
55     <xsl:attribute name="select">@*</xsl:attribute>
56     </xsl:element>
57     <xsl:element name="xsl:apply-templates" />
58     </xsl:element>
59    
60     </xsl:element>
61     <!-- </xsl:template> -->
62    
63 joko 1.4 <!--
64     1. Note: Former custom passthru logic (copy all untouched nodes)
65     now completely replaced by Mike Kay's "identity template rule".
66     What is left here is just the required overriding of some builtin rules
67     to (e.g.) not to loose comments.
68     -->
69     <xsl:comment> 1. override built-in rules </xsl:comment>
70     <!-- override some builtin rules: see http://www.w3.org/TR/xslt#built-in-rule -->
71     <xsl:element name="xsl:template"><xsl:attribute name="match">comment()</xsl:attribute>
72     <xsl:element name="xsl:call-template">
73     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
74     </xsl:element>
75 joko 1.1 </xsl:element>
76    
77     <!-- continue with all inline nodes -->
78     <xsl:apply-templates />
79    
80     </xsl:template>
81    
82 joko 1.2
83    
84    
85    
86     <!-- code -->
87 joko 1.1 <!-- This node "encapsulates" infrastructure for handling the directives. -->
88 joko 1.4
89     <!-- Dispatch all "XUpdate Services" here. -->
90     <!-- FIXME: Actually implement action = "CREATE|RETRIEVE|UPDATE|DELETE"!!! -->
91 joko 1.1 <xsl:template match="xupdate:insert-after">
92 joko 1.2 <!-- <xsl:variable name="select" select="@select">Hello World!</xsl:variable> -->
93 joko 1.4 <xsl:call-template name="findcontext">
94     <xsl:with-param name="service">Insert</xsl:with-param>
95     <xsl:with-param name="position">after</xsl:with-param>
96     </xsl:call-template>
97     </xsl:template>
98    
99     <xsl:template match="xupdate:insert-before">
100     <xsl:call-template name="findcontext">
101     <xsl:with-param name="service">Insert</xsl:with-param>
102     <xsl:with-param name="position">before</xsl:with-param>
103     </xsl:call-template>
104     </xsl:template>
105    
106     <xsl:template match="xupdate:append">
107     <xsl:call-template name="findcontext">
108     <xsl:with-param name="service">Append</xsl:with-param>
109     <!-- <xsl:with-param name="position">inline</xsl:with-param> -->
110     <xsl:with-param name="test">.</xsl:with-param>
111     </xsl:call-template>
112     </xsl:template>
113    
114     <xsl:template match="xupdate:update">
115     <xsl:call-template name="findcontext">
116     <xsl:with-param name="service">Update</xsl:with-param>
117     <!-- <xsl:with-param name="position">after</xsl:with-param> -->
118     <xsl:with-param name="test">.</xsl:with-param>
119     </xsl:call-template>
120     </xsl:template>
121    
122     <xsl:template match="xupdate:remove">
123     <xsl:call-template name="findcontext">
124     <xsl:with-param name="service">Remove</xsl:with-param>
125     <!-- <xsl:with-param name="position">after</xsl:with-param> -->
126     <xsl:with-param name="test">.</xsl:with-param>
127     </xsl:call-template>
128     </xsl:template>
129    
130     <xsl:template match="xupdate:rename">
131     <xsl:call-template name="findcontext">
132     <xsl:with-param name="service">Rename</xsl:with-param>
133     <!-- <xsl:with-param name="position">after</xsl:with-param> -->
134     <xsl:with-param name="test">.</xsl:with-param>
135     </xsl:call-template>
136     </xsl:template>
137    
138    
139    
140     <xsl:template name="findcontext">
141    
142     <xsl:comment> 2. context finder </xsl:comment>
143    
144     <!-- new of 2003-05-06: introducing parameters here to handle all cases -->
145     <xsl:param name="service" />
146     <xsl:param name="position" />
147     <!-- new of 2003-05-07: replacement for test if undef -->
148     <xsl:param name="test" />
149    
150     <!--
151     <xsl:comment>
152     service: <xsl:value-of select="$service" />
153     position: <xsl:value-of select="$position" />
154     test: <xsl:value-of select="$test" />
155     </xsl:comment>
156     -->
157    
158 joko 1.2 <!-- this resembles some parts of the CRUD API - retranslated to self-hosting xsl -->
159    
160     <!-- V1 -->
161     <!-- <xsl:element name="xsl:template"> -->
162     <!-- <xsl:attribute name="match"><xsl:value-of select="@select" /></xsl:attribute> -->
163 joko 1.4
164     <!-- fallback -->
165     <xsl:element name="xsl:template">
166     <xsl:attribute name="match">*</xsl:attribute>
167     <xsl:element name="xsl:call-template">
168     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
169     <!-- <xsl:attribute name="name">passthru</xsl:attribute> -->
170     </xsl:element>
171     </xsl:element>
172 joko 1.2
173     <!-- V2 -->
174     <xsl:element name="xsl:template">
175 joko 1.3 <!-- <xsl:attribute name="match">/addresses/address</xsl:attribute> -->
176 joko 1.4 <!-- <xsl:attribute name="match">*</xsl:attribute> -->
177     <xsl:attribute name="match"><xsl:value-of select="@select" /></xsl:attribute>
178 joko 1.2
179     <xsl:element name="xsl:choose">
180     <!-- <xsl:attribute name="match"><xsl:value-of select="@select" /></xsl:attribute> -->
181     <xsl:element name="xsl:when">
182 joko 1.4 <!-- <xsl:attribute name="test"><xsl:value-of select="@select" /></xsl:attribute> -->
183     <xsl:attribute name="test"><xsl:value-of select="@test" /><xsl:value-of select="$test" /></xsl:attribute>
184 joko 1.2
185 joko 1.4 <xsl:choose>
186     <xsl:when test="{$service}=Insert">
187    
188     <xsl:comment> 2.a. Insert </xsl:comment>
189    
190     <!-- Implementation of "xupdate:insert-before" -->
191     <xsl:choose>
192     <xsl:when test="{$position}=before">
193     <xsl:apply-templates />
194     </xsl:when>
195     </xsl:choose>
196    
197     <!-- call the "identity template rule" to passthru all childnodes -->
198     <xsl:element name="xsl:call-template">
199     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
200     <!-- <xsl:attribute name="name">passthru</xsl:attribute> -->
201     </xsl:element>
202    
203     <!-- Implementation of "xupdate:insert-after" -->
204     <xsl:choose>
205     <xsl:when test="{$position}=after">
206     <xsl:apply-templates />
207     </xsl:when>
208     </xsl:choose>
209    
210     </xsl:when>
211    
212     <!-- Implementation of "xupdate:append" -->
213     <xsl:when test="{$service}=Append">
214     <xsl:comment> 2.b. Append </xsl:comment>
215     <!-- V1 -->
216     <!-- <xsl:apply-templates /> -->
217     <!-- V2 -->
218     <xsl:element name="xsl:copy">
219     <!--
220     <xsl:element name="xsl:copy-of">
221     <xsl:attribute name="select">@*</xsl:attribute>
222     </xsl:element>
223     -->
224     <!-- Keep content ... -->
225     <xsl:element name="xsl:apply-templates" />
226     <!-- Append this: -->
227     <xsl:apply-templates />
228     </xsl:element>
229     </xsl:when>
230    
231     <!-- Implementation of "xupdate:update" -->
232     <xsl:when test="{$service}=Update">
233     <xsl:comment> 2.c. Update </xsl:comment>
234     <!-- V1 -->
235     <!-- <xsl:apply-templates /> -->
236     <!-- V2 -->
237     <xsl:element name="xsl:copy">
238     <!--
239     <xsl:element name="xsl:copy-of">
240     <xsl:attribute name="select">@*</xsl:attribute>
241     </xsl:element>
242     -->
243     <!-- Keep content ... -->
244     <!-- <xsl:element name="xsl:apply-templates" /> -->
245     <!-- Add (replace through) this: -->
246     <xsl:apply-templates />
247     </xsl:element>
248     </xsl:when>
249    
250     <!-- Implementation of "xupdate:remove" -->
251     <xsl:when test="{$service}=Remove">
252     <xsl:comment> 2.d. Remove </xsl:comment>
253     </xsl:when>
254    
255     <!-- Implementation of "xupdate:rename" -->
256     <xsl:when test="{$service}=Rename">
257     <xsl:comment> 2.e. Rename (Remove context and Append modified identity template) </xsl:comment>
258    
259     <xsl:comment> [5.a.] modify node name </xsl:comment>
260     <xsl:element name="xsl:element">
261     <!-- this renames the node (change the "name"-attribute) -->
262     <xsl:attribute name="name">
263     <xsl:apply-templates />
264     </xsl:attribute>
265     <!-- this propagates the original content -->
266     <xsl:element name="xsl:apply-templates" />
267     </xsl:element>
268 joko 1.2
269 joko 1.4 </xsl:when>
270 joko 1.2
271 joko 1.4 </xsl:choose>
272 joko 1.2
273     </xsl:element>
274     <xsl:element name="xsl:otherwise">
275    
276     <!-- call the "identity template rule" to passthru all childnodes -->
277     <xsl:element name="xsl:call-template">
278     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
279 joko 1.3 <!-- <xsl:attribute name="name">passthru</xsl:attribute> -->
280 joko 1.2 </xsl:element>
281 joko 1.3
282     <!-- <xsl:apply-templates /> -->
283 joko 1.2 </xsl:element>
284    
285     </xsl:element>
286     </xsl:element>
287 joko 1.4
288 joko 1.2 <!-- <xsl:apply-templates /> -->
289    
290 joko 1.1 </xsl:template>
291    
292 joko 1.4
293     <!--
294     Rewrite XUpdate elements to XSLT elements.
295     These templates pass through all attributes
296     and childnodes rewriting the tagname only.
297     FIXME: The redundant encoding for each XUpdate
298     element type seems dummy. Could this be stripped
299     shorter somehow sometimes?
300     -->
301    
302 joko 1.1 <xsl:template match="xupdate:element">
303 joko 1.4 <xsl:comment> 3.a. vivify generic node </xsl:comment>
304 joko 1.1 <xsl:element name="xsl:element">
305     <xsl:copy-of select="@*"/>
306     <xsl:apply-templates />
307     </xsl:element>
308     </xsl:template>
309    
310     <xsl:template match="xupdate:attribute">
311 joko 1.4 <xsl:comment> 3.b. vivify node attributes </xsl:comment>
312 joko 1.1 <xsl:element name="xsl:attribute">
313     <xsl:copy-of select="@*"/>
314     <xsl:apply-templates />
315     </xsl:element>
316     </xsl:template>
317    
318 joko 1.4 <xsl:template match="xupdate:text">
319     <xsl:comment> 4.a. vivify text node </xsl:comment>
320     <xsl:element name="xsl:text">
321     <xsl:copy-of select="@*"/>
322     <xsl:apply-templates />
323     </xsl:element>
324     </xsl:template>
325    
326     <xsl:template match="xupdate:processing-instruction">
327     <xsl:comment> 4.b. vivify PI node </xsl:comment>
328     <xsl:element name="xsl:processing-instruction">
329     <xsl:copy-of select="@*"/>
330     <xsl:apply-templates />
331     </xsl:element>
332     </xsl:template>
333    
334     <xsl:template match="xupdate:comment">
335     <xsl:comment> 4.c. vivify comment node </xsl:comment>
336     <xsl:element name="xsl:comment">
337     <xsl:copy-of select="@*"/>
338     <xsl:apply-templates />
339     </xsl:element>
340     </xsl:template>
341    
342 joko 1.5 <!--
343     xsl for [2.9 Variables and Values of Variables]
344     Encapsulates block payload into a named template.
345     -->
346 joko 1.4 <xsl:template match="xupdate:variable">
347     <xsl:comment> 5.a. vivify xsl-element "variable" </xsl:comment>
348 joko 1.5
349     <xsl:element name="xsl:template">
350     <xsl:attribute name="name">Variables</xsl:attribute>
351    
352     <!--
353     <xsl:element name="xsl:variable">
354     <xsl:attribute name="name"><xsl:value-of select="@name" /></xsl:attribute>
355     -->
356    
357     <xsl:element name="xsl:apply-templates">
358     <xsl:attribute name="select"><xsl:value-of select="@select" /></xsl:attribute>
359     </xsl:element>
360    
361     <!-- <xsl:value-of select="@select" /> -->
362     <xsl:value-of select="." />
363 joko 1.4 <!--
364 joko 1.5 </xsl:element>
365 joko 1.4 -->
366 joko 1.5
367 joko 1.4 </xsl:element>
368 joko 1.5
369 joko 1.4 </xsl:template>
370    
371     <xsl:template match="xupdate:value-of">
372     <xsl:comment> 5.b. vivify xsl-element "value-of" </xsl:comment>
373 joko 1.5 <xsl:element name="xsl:call-template">
374     <xsl:attribute name="name">Variables</xsl:attribute>
375     </xsl:element>
376     <xsl:element name="xsl:value-of">
377 joko 1.4 <xsl:copy-of select="@*"/>
378 joko 1.5 <!-- <xsl:apply-templates /> -->
379     <!-- this propagates the original content -->
380     <!-- <xsl:element name="xsl:apply-templates"> -->
381     <!-- <xsl:attribute name="" > -->
382     <!-- </xsl:element> -->
383 joko 1.4 </xsl:element>
384     </xsl:template>
385    
386    
387     </xsl:stylesheet>
388 joko 1.1

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed