/[cvs]/joko/Scripts/xupdate/xupdate.pl
ViewVC logotype

Contents of /joko/Scripts/xupdate/xupdate.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations)
Thu May 1 19:47:09 2003 UTC (21 years ago) by joko
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +156 -39 lines
File MIME type: text/plain
attempts to get things going

1 #!/usr/bin/perl
2
3 ## -------------------------------------------------------------------------
4 ## $Id: xupdate.pl,v 1.3 2003/04/26 01:42:39 joko Exp $
5 ## -------------------------------------------------------------------------
6 ## $Log: xupdate.pl,v $
7 ## Revision 1.3 2003/04/26 01:42:39 joko
8 ## first attempt to make up a crud template
9 ##
10 ## Revision 1.2 2003/04/25 12:35:23 joko
11 ## added some pod
12 ## revamped xsl
13 ##
14 ## Revision 1.1 2003/04/24 21:07:36 joko
15 ## initial commit
16 ##
17 ## -------------------------------------------------------------------------
18
19
20 =pod
21
22
23 =head3 Overview
24
25 This is not the same xupdate currently available from CPAN at
26 http://search.cpan.org/author/PAJAS/XML-XUpdate-LibXML-0.4.0/xupdate .
27
28 Its intention - however - is identical:
29 xupdate - Process XUpdate commands over an XML document
30
31 =head3 Their implementations differ:
32 xupdate (by Petr Pajas) uses ...
33 XML::XUpdate::LibXML - Simple implementation of XUpdate format
34
35 ... which is based on XML::LibXML which in turn is:
36 This module is an interface to the gnome libxml2 DOM parser (no SAX parser support yet),
37 and the DOM tree. It also provides an XML::XPath-like findnodes() interface, providing
38 access to the XPath API in libxml2.
39
40
41 =head3 Yet another xupdate - facts in short:
42
43 S: It would be nice to have a pure perl thingy which does (almost) the same stuff....
44
45 Q: Can we achieve compliance with its (XML::XUpdate::LibXML) API? (just a subset ....)
46
47 Q: Can we achieve the processing declared as a XSL document processed using CPAN's XML::XSLT?
48
49 Q: Proposal: XML::XUpdate::XSLT!?
50
51 Q: Can we mimic/use the interface of the - already established - 'xupdate' program???
52
53 Q: Should we follow the CRUD path first?
54
55
56 =cut
57
58
59 package main;
60
61 use strict;
62 use warnings;
63
64 BEGIN {
65 use lib '../../../nfo/perl/libs';
66 }
67
68 use Data::Dumper;
69 use XML::XSLT;
70 #use XML::DOM;
71 #use XML::DOM::Document;
72 use shortcuts::files qw( f2s );
73
74 my $file = 'c:/home/amo/develop/top-scores.net/ts/backend/var/resources/control/import_select.xml';
75
76
77 #my $stylesheet_xupdate = '
78
79 my $stylesheet_xupdate = '<?xml version="1.0" encoding="ISO-8859-1"?>
80
81 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
82
83 <!--
84
85 Purpose of this XML Stylesheet is to implement a set of templates
86 to do simple xml node manipulation. (kinda XML API)
87 Main target is "flexible insertion of new xml child nodes".
88
89 If this attempt works out well, it will be continued by a follow-up
90 trying to implement XUpdate in XSLT.
91
92
93 References:
94 - XUpdate:
95 Requirements: http://www.xmldb.org/xupdate/xupdate-req.html
96 Working Draft: http://www.xmldb.org/xupdate/xupdate-wd.html
97 - XML API:
98 - XML::XUpdate::LibXML: http://search.cpan.org/author/PAJAS/XML-XUpdate-LibXML-0.4.0/lib/XML/XUpdate/LibXML.pm
99 - XSL / XSLT:
100 http://www.w3.org/TR/xslt
101 http://www.xsl-rp.de/
102 http://xml.klute-thiemann.de/w3c-de/REC-xslt-20020318/
103 http://xmlxslt.sourceforge.net/
104 - misc pointers:
105 "Re: Modify XML documents": http://aspn.activestate.com/ASPN/Mail/Message/perl-xml/1265431
106 XSL Extensions: http://xmlsoft.org/XSLT/extensions.html
107 EXSLT: http://www.exslt.org/set/functions/difference/index.html
108 "how to insert element at required position in document tree?": http://p2p.wrox.com/archive/xslt/2001-06/98.asp
109 XML APIs for Databases: http://www.javaworld.com/javaworld/jw-01-2000/jw-01-dbxml.html
110
111 -->
112
113 <xsl:output method="raw"/>
114
115 <!-- 1. This is the passthru logic (copy all untouched nodes). -->
116 <xsl:template name="passthru"><xsl:copy><xsl:apply-templates /></xsl:copy></xsl:template>
117 <!-- activate this -->
118 <xsl:template match="*"><xsl:call-template name="passthru" /></xsl:template>
119 <!-- override some builtin rules: see http://www.w3.org/TR/xslt#built-in-rule -->
120 <xsl:template match="comment()"><xsl:call-template name="passthru" /></xsl:template>
121
122 <!-- 2. This is the crud API. -->
123
124 <!-- 2.a. The context finder. -->
125
126 <!-- query part one: the node name -->
127 <xsl:template match="source">
128 <xsl:choose>
129 <!-- query part two: the attrib key and value -->
130 <xsl:when test="@key=expekt">
131 <xsl:call-template name="crud" >
132 <xsl:with-param name="action">CREATE</xsl:with-param>
133 <xsl:with-param name="mode">callback</xsl:with-param>
134 <xsl:with-param name="cbname">abc</xsl:with-param>
135 </xsl:call-template>
136 </xsl:when>
137 <xsl:otherwise>
138 <xsl:call-template name="passthru_kay" />
139 </xsl:otherwise>
140 </xsl:choose>
141 </xsl:template>
142
143
144 <!-- 2.b. The node manipulators: They translate the current context. -->
145
146 <!-- by Mike Kay, Software AG [http://p2p.wrox.com/archive/xslt/2001-06/98.asp] -->
147 <!-- enhancements & comments: Andreas Motl, rotamente.de -->
148 <!-- <xsl:template match="source"> -->
149 <xsl:template name="passthru_kay">
150 <xsl:copy>
151 <xsl:copy-of select="@*" />
152 <xsl:apply-templates />
153 </xsl:copy>
154 </xsl:template>
155
156 <xsl:template name="inject_kay_motl">
157 <xsl:param name="payload" />
158 <xsl:value-of select="$payload" />
159 <xsl:copy>
160 <xsl:copy-of select="@*" />
161 <xsl:apply-templates />
162 <!-- <xsl:apply-templates select="*[3]" /> -->
163 <!-- <xsl:value-of select="text()" /> -->
164 <!-- Multiple handlers here now: a) create fressshhhh element, b) clone s.th. -->
165 <!-- TODO: Do switch/case or couple of if/then statements here to be able to handle that "at runtime". -->
166 <xsl:call-template name="create_fresh_element" />
167 <xsl:call-template name="clone_last_element" />
168 <xsl:call-template name="clone_element_nr" />
169 </xsl:copy>
170 </xsl:template>
171
172 <xsl:template name="crud">
173
174 <xsl:param name="action" />
175 <xsl:param name="payload" />
176 <xsl:param name="mode" />
177 <xsl:param name="cbname" />
178
179 <!--
180 action: <xsl:value-of select="$action" />
181 payload: <xsl:value-of select="$payload" />
182 -->
183
184 <!--
185 <xsl:if test="$action=5">
186 CRUD: CREATE - if
187 </xsl:if>
188 -->
189
190 <xsl:copy>
191
192 <xsl:copy-of select="@*" />
193 <xsl:apply-templates />
194
195 <!-- crud action dispatcher -->
196 <xsl:choose>
197
198 <!-- CREATE -->
199 <xsl:when test="{$action}=CREATE">
200
201 <!-- thats a (compact) switch case in xsl lingo! -->
202 <xsl:choose>
203
204 <xsl:when test="$payload!=">
205 <xsl:comment> Payload injected on {timestamp} </xsl:comment>
206 <xsl:value-of select="$payload" />
207 </xsl:when>
208
209 <xsl:when test="$mode=callback">
210 <xsl:comment> Payload injected via callback <xsl:value-of select="{$cbname}" /> on {$timestamp} </xsl:comment>
211 <xsl:call-template name="xupdate_element_create_embedded" />
212 </xsl:when>
213
214 <xsl:otherwise>
215 <xsl:comment> Cloned last element as template on {timestamp} </xsl:comment>
216 <xsl:call-template name="clone_last_element" />
217 </xsl:otherwise>
218
219 </xsl:choose>
220
221 </xsl:when>
222
223 <xsl:otherwise>
224 <xsl:comment>
225 UNKOWN CRUD ACTION: "<xsl:value-of select="$action" />" on <xsl:value-of select="$now" />.
226 </xsl:comment>
227 </xsl:otherwise>
228
229 </xsl:choose>
230
231 </xsl:copy>
232
233 </xsl:template>
234
235
236
237 <!-- 2.c. The element manipulators: They mungle a specific element inside the current context. -->
238
239 <!-- copy over node 1:1 (use last element as a template) -->
240 <xsl:template name="clone_last_element">
241 <xsl:copy-of select="*[last()]" />
242 </xsl:template>
243
244 <xsl:template name="clone_element_nr">
245 <!-- TODO: let idx be passed in via "with-param" or s.th.l.th. -->
246 <xsl:copy-of select="*[2]" />
247 </xsl:template>
248
249 <!-- creates instance of new element -->
250 <xsl:template name="create_fresh_element">
251 <xsl:element name="new">content</xsl:element>
252 </xsl:template>
253
254 <xsl:template name="xupdate_element_create_embedded">
255 <xsl:variable name="huhu" select="*[0]/@key">haha</xsl:variable>
256 <!-- <xsl:transform version="1.1" xmlns:xupdate="http://www.xmldb.org/xupdate"> -->
257 <!-- <xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate"> -->
258 <!-- <xsl:append select="/addresses" child="last()"> -->
259 <xsl:element name="address">
260 <town>San Francisco</town>
261 </xsl:element>
262 <xsl:value-of select="*[0]/@key" />
263 <xsl:value-of select="$huhu" />
264 <!-- </xupdate:modifications> -->
265 <!-- </xsl:append> -->
266 <!-- </xsl:transform> -->
267 </xsl:template>
268
269
270 <!-- inject other stuff -->
271 <xsl:template name="inject_template">
272 <xsl:comment> Hello World! </xsl:comment>
273
274 </xsl:template>
275
276
277
278
279 <!-- 0. The root node dispatcher. -->
280 <!-- <xsl:template match="source"><xsl:call-template name="insertChildNode"/></xsl:template> -->
281
282 <!-- 2. This is the manipulation logic: insertChildNode -->
283
284 <!-- 2.a. The "API" method. - now deprecated -->
285 <xsl:template name="insertChildNode">
286
287 <!-- manipulate node -->
288 <xsl:comment> node - begin </xsl:comment>
289
290 <!-- <xsl:copy-of select="source" /> -->
291 <xsl:copy>
292
293 <!-- Pass through children 1:1. -->
294 <xsl:apply-templates />
295
296 <!-- Call one of the manipulators - this implements injection behavior. -->
297 <xsl:call-template name="clone_last_element" />
298 <xsl:call-template name="inject_template" />
299
300 </xsl:copy>
301 <xsl:comment> node - end </xsl:comment>
302
303 </xsl:template>
304
305
306 </xsl:stylesheet>
307
308 ';
309
310
311
312
313 # examples from http://www.xmldb.org/xupdate/xupdate-wd.html#N238f4
314
315 my $xml_document = qq(<?xml version="1.0"?>
316 <addresses version="1.0">
317 <address id="1">
318 <fullname>Andreas Laux</fullname>
319 <born day='1' month='12' year='1978'/>
320 <town>Leipzig</town>
321 <country>Germany</country>
322 </address>
323 </addresses>
324 );
325
326 # a stripped example (the "xupdate payload")
327 my $xml_xupdate_stripped = qq(
328 <xupdate:element name="address">
329 <xupdate:attribute name="id">2</xupdate:attribute>
330 <fullname>Lars Martin</fullname>
331 <born day='2' month='12' year='1974'/>
332 <town>Leizig</town>
333 <country>Germany</country>
334 </xupdate:element>
335 );
336
337 # a full xupdate example (including the directive)
338 my $xml_xupdate_full = qq(<?xml version="1.0"?>
339 <xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
340
341 <xupdate:insert-after select="/addresses/address[1]" >
342
343 <xupdate:element name="address">
344 <xupdate:attribute name="id">2</xupdate:attribute>
345 <fullname>Lars Martin</fullname>
346 <born day='2' month='12' year='1974'/>
347 <town>Leizig</town>
348 <country>Germany</country>
349 </xupdate:element>
350
351 </xupdate:insert-after>
352
353 </xupdate:modifications>
354 );
355
356 sub main_old {
357 #$xslt->open_xml( Source => f2s($file) );
358 #$xslt->open_xml( Source => $xml_xupdate_full );
359 #$xslt->xsl_ns('xupdate', 'xsl');
360
361 #$xslt->process();
362 #print $xslt->toString(), "\n";
363 }
364
365
366 sub main {
367
368 use XML::XUpdate::XSLT;
369 my $xupdate = XML::XUpdate::XSLT->new(
370 warnings => 1
371 );
372
373 #print Dumper($xupdate);
374
375 $xupdate->open_document( $xml_document );
376 #exit;
377
378 $xupdate->open_xupdate( $xml_xupdate_full );
379
380 $xupdate->process();
381 my $result = $xupdate->toString();
382 if ($result) {
383 print $result, "\n";
384 } else {
385 print "No result.", "\n";
386 }
387
388 }
389
390 main();
391 print "ready.", "\n";
392
393 1;
394 __END__

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