/[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.4 - (hide annotations)
Wed May 7 03:40:30 2003 UTC (21 years ago) by joko
Branch: MAIN
Changes since 1.3: +268 -49 lines
File MIME type: text/xml
tried to fill in more MUSTS from the XUpdate spec
updated description (header)

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     <xsl:param name="town" />
150    
151     <xsl:variable name="town" select="huhu">haha</xsl:variable>
152    
153     <!--
154     <xsl:comment>
155     service: <xsl:value-of select="$service" />
156     position: <xsl:value-of select="$position" />
157     test: <xsl:value-of select="$test" />
158     </xsl:comment>
159     -->
160    
161 joko 1.2 <!-- this resembles some parts of the CRUD API - retranslated to self-hosting xsl -->
162    
163     <!-- V1 -->
164     <!-- <xsl:element name="xsl:template"> -->
165     <!-- <xsl:attribute name="match"><xsl:value-of select="@select" /></xsl:attribute> -->
166 joko 1.4
167     <!-- fallback -->
168     <xsl:element name="xsl:template">
169     <xsl:attribute name="match">*</xsl:attribute>
170     <xsl:element name="xsl:call-template">
171     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
172     <!-- <xsl:attribute name="name">passthru</xsl:attribute> -->
173     </xsl:element>
174     </xsl:element>
175 joko 1.2
176     <!-- V2 -->
177     <xsl:element name="xsl:template">
178 joko 1.3 <!-- <xsl:attribute name="match">/addresses/address</xsl:attribute> -->
179 joko 1.4 <!-- <xsl:attribute name="match">*</xsl:attribute> -->
180     <xsl:attribute name="match"><xsl:value-of select="@select" /></xsl:attribute>
181 joko 1.2
182     <xsl:element name="xsl:choose">
183     <!-- <xsl:attribute name="match"><xsl:value-of select="@select" /></xsl:attribute> -->
184     <xsl:element name="xsl:when">
185 joko 1.4 <!-- <xsl:attribute name="test"><xsl:value-of select="@select" /></xsl:attribute> -->
186     <xsl:attribute name="test"><xsl:value-of select="@test" /><xsl:value-of select="$test" /></xsl:attribute>
187 joko 1.2
188 joko 1.4 <xsl:choose>
189     <xsl:when test="{$service}=Insert">
190    
191     <xsl:comment> 2.a. Insert </xsl:comment>
192    
193     <!-- Implementation of "xupdate:insert-before" -->
194     <xsl:choose>
195     <xsl:when test="{$position}=before">
196     <xsl:apply-templates />
197     </xsl:when>
198     </xsl:choose>
199    
200     <!-- call the "identity template rule" to passthru all childnodes -->
201     <xsl:element name="xsl:call-template">
202     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
203     <!-- <xsl:attribute name="name">passthru</xsl:attribute> -->
204     </xsl:element>
205    
206     <!-- Implementation of "xupdate:insert-after" -->
207     <xsl:choose>
208     <xsl:when test="{$position}=after">
209     <xsl:apply-templates />
210     </xsl:when>
211     </xsl:choose>
212    
213     </xsl:when>
214    
215     <!-- Implementation of "xupdate:append" -->
216     <xsl:when test="{$service}=Append">
217     <xsl:comment> 2.b. Append </xsl:comment>
218     <!-- V1 -->
219     <!-- <xsl:apply-templates /> -->
220     <!-- V2 -->
221     <xsl:element name="xsl:copy">
222     <!--
223     <xsl:element name="xsl:copy-of">
224     <xsl:attribute name="select">@*</xsl:attribute>
225     </xsl:element>
226     -->
227     <!-- Keep content ... -->
228     <xsl:element name="xsl:apply-templates" />
229     <!-- Append this: -->
230     <xsl:apply-templates />
231     </xsl:element>
232     </xsl:when>
233    
234     <!-- Implementation of "xupdate:update" -->
235     <xsl:when test="{$service}=Update">
236     <xsl:comment> 2.c. Update </xsl:comment>
237     <!-- V1 -->
238     <!-- <xsl:apply-templates /> -->
239     <!-- V2 -->
240     <xsl:element name="xsl:copy">
241     <!--
242     <xsl:element name="xsl:copy-of">
243     <xsl:attribute name="select">@*</xsl:attribute>
244     </xsl:element>
245     -->
246     <!-- Keep content ... -->
247     <!-- <xsl:element name="xsl:apply-templates" /> -->
248     <!-- Add (replace through) this: -->
249     <xsl:apply-templates />
250     </xsl:element>
251     </xsl:when>
252    
253     <!-- Implementation of "xupdate:remove" -->
254     <xsl:when test="{$service}=Remove">
255     <xsl:comment> 2.d. Remove </xsl:comment>
256     </xsl:when>
257    
258     <!-- Implementation of "xupdate:rename" -->
259     <xsl:when test="{$service}=Rename">
260     <xsl:comment> 2.e. Rename (Remove context and Append modified identity template) </xsl:comment>
261    
262     <xsl:comment> [5.a.] modify node name </xsl:comment>
263     <xsl:element name="xsl:element">
264     <!-- this renames the node (change the "name"-attribute) -->
265     <xsl:attribute name="name">
266     <xsl:apply-templates />
267     </xsl:attribute>
268     <!-- this propagates the original content -->
269     <xsl:element name="xsl:apply-templates" />
270     </xsl:element>
271 joko 1.2
272 joko 1.4 </xsl:when>
273 joko 1.2
274 joko 1.4 </xsl:choose>
275 joko 1.2
276     </xsl:element>
277     <xsl:element name="xsl:otherwise">
278    
279     <!-- call the "identity template rule" to passthru all childnodes -->
280     <xsl:element name="xsl:call-template">
281     <xsl:attribute name="name">identity_template_rule</xsl:attribute>
282 joko 1.3 <!-- <xsl:attribute name="name">passthru</xsl:attribute> -->
283 joko 1.2 </xsl:element>
284 joko 1.3
285     <!-- <xsl:apply-templates /> -->
286 joko 1.2 </xsl:element>
287    
288     </xsl:element>
289     </xsl:element>
290 joko 1.4
291 joko 1.2 <!-- <xsl:apply-templates /> -->
292    
293 joko 1.1 </xsl:template>
294    
295 joko 1.4
296     <!--
297     Rewrite XUpdate elements to XSLT elements.
298     These templates pass through all attributes
299     and childnodes rewriting the tagname only.
300     FIXME: The redundant encoding for each XUpdate
301     element type seems dummy. Could this be stripped
302     shorter somehow sometimes?
303     -->
304    
305 joko 1.1 <xsl:template match="xupdate:element">
306 joko 1.4 <xsl:comment> 3.a. vivify generic node </xsl:comment>
307 joko 1.1 <xsl:element name="xsl:element">
308     <xsl:copy-of select="@*"/>
309     <xsl:apply-templates />
310     </xsl:element>
311     </xsl:template>
312    
313     <xsl:template match="xupdate:attribute">
314 joko 1.4 <xsl:comment> 3.b. vivify node attributes </xsl:comment>
315 joko 1.1 <xsl:element name="xsl:attribute">
316     <xsl:copy-of select="@*"/>
317     <xsl:apply-templates />
318     </xsl:element>
319     </xsl:template>
320    
321 joko 1.4 <xsl:template match="xupdate:text">
322     <xsl:comment> 4.a. vivify text node </xsl:comment>
323     <xsl:element name="xsl:text">
324     <xsl:copy-of select="@*"/>
325     <xsl:apply-templates />
326     </xsl:element>
327     </xsl:template>
328    
329     <xsl:template match="xupdate:processing-instruction">
330     <xsl:comment> 4.b. vivify PI node </xsl:comment>
331     <xsl:element name="xsl:processing-instruction">
332     <xsl:copy-of select="@*"/>
333     <xsl:apply-templates />
334     </xsl:element>
335     </xsl:template>
336    
337     <xsl:template match="xupdate:comment">
338     <xsl:comment> 4.c. vivify comment node </xsl:comment>
339     <xsl:element name="xsl:comment">
340     <xsl:copy-of select="@*"/>
341     <xsl:apply-templates />
342     </xsl:element>
343     </xsl:template>
344    
345     <!-- xsl for [2.9 Variables and Values of Variables] -->
346     <xsl:template match="xupdate:variable">
347     <xsl:comment> 5.a. vivify xsl-element "variable" </xsl:comment>
348     <xsl:element name="xsl:variable">
349     <xsl:copy-of select="@*"/>
350     <!--
351     <xsl:apply-templates />
352     -->
353     <!-- <xsl:element name="xsl:apply-templates" > -->
354     <xsl:attribute name="select">
355     <!-- <xsl:apply-templates /> -->
356     /addresses[2]/address[4]/town
357     </xsl:attribute>
358     <!-- </xsl:element> -->
359     hui
360     </xsl:element>
361    
362     </xsl:template>
363    
364     <xsl:template match="xupdate:value-of">
365     <xsl:comment> 5.b. vivify xsl-element "value-of" </xsl:comment>
366     <xsl:element name="xsl:value-of">
367     <xsl:copy-of select="@*"/>
368     <xsl:apply-templates />
369     </xsl:element>
370     <xsl:text>abs</xsl:text>
371     </xsl:template>
372    
373    
374     </xsl:stylesheet>
375 joko 1.1

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