VirtualBox

source: vbox/trunk/src/VBox/Main/idl/midl.xsl@ 7207

Last change on this file since 7207 was 7207, checked in by vboxsync, 17 years ago

Main: Reworked enums to avoid 1) weird duplication of enum name when referring to enum values in cross-platform code; 2) possible clashes on Win32 due to putting identifiers like Paused or Disabled to the global namespace (via C enums). In the new style, enums are used like this: a) USBDeviceState_T v = USBDeviceState_Busy from cross-platform non-Qt code; b) KUSBDeviceState v = KUSBDeviceState_Busy from Qt code; c) USBDeviceState v = USBDeviceState_Busy from plain Win32 and d) PRUInt32 USBDeviceState v = USBDeviceState::Busy from plain XPCOM.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.5 KB
Line 
1<?xml version="1.0"?>
2
3<!--
4 * A template to generate a MS IDL compatible interface definition file
5 * from the generic interface definition expressed in XML.
6
7 Copyright (C) 2006-2007 innotek GmbH
8
9 This file is part of VirtualBox Open Source Edition (OSE), as
10 available from http://www.virtualbox.org. This file is free software;
11 you can redistribute it and/or modify it under the terms of the GNU
12 General Public License (GPL) as published by the Free Software
13 Foundation, in version 2 as it comes in the "COPYING" file of the
14 VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16-->
17
18<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
19<xsl:output method="text"/>
20
21<xsl:strip-space elements="*"/>
22
23
24<!--
25// helper definitions
26/////////////////////////////////////////////////////////////////////////////
27-->
28
29<!--
30 * capitalizes the first letter
31-->
32<xsl:template name="capitalize">
33 <xsl:param name="str" select="."/>
34 <xsl:value-of select="
35 concat(
36 translate(substring($str,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
37 substring($str,2)
38 )
39 "/>
40</xsl:template>
41
42<!--
43 * uncapitalizes the first letter only if the second one is not capital
44 * otherwise leaves the string unchanged
45-->
46<xsl:template name="uncapitalize">
47 <xsl:param name="str" select="."/>
48 <xsl:choose>
49 <xsl:when test="not(contains('ABCDEFGHIJKLMNOPQRSTUVWXYZ', substring($str,2,1)))">
50 <xsl:value-of select="
51 concat(
52 translate(substring($str,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),
53 substring($str,2)
54 )
55 "/>
56 </xsl:when>
57 <xsl:otherwise>
58 <xsl:value-of select="string($str)"/>
59 </xsl:otherwise>
60 </xsl:choose>
61</xsl:template>
62
63
64<!--
65// templates
66/////////////////////////////////////////////////////////////////////////////
67-->
68
69
70<!--
71 * header
72-->
73<xsl:template match="/idl">
74 <xsl:text>
75/*
76 * DO NOT EDIT! This is a generated file.
77 *
78 * MS IDL (MIDL) definition for VirualBox Main API (COM interfaces)
79 * generated from XIDL (XML interface definition).
80 *
81 * Source : src/VBox/Main/idl/VirtualBox.xidl
82 * Generator : src/VBox/Main/idl/midl.xsl
83 */
84 </xsl:text>
85 <xsl:text>&#x0A;</xsl:text>
86 <xsl:text>import "unknwn.idl";&#x0A;&#x0A;</xsl:text>
87 <xsl:apply-templates/>
88</xsl:template>
89
90
91<!--
92 * ignore all |if|s except those for MIDL target
93-->
94<xsl:template match="if">
95 <xsl:if test="@target='midl'">
96 <xsl:apply-templates/>
97 </xsl:if>
98</xsl:template>
99<xsl:template match="if" mode="forward">
100 <xsl:if test="@target='midl'">
101 <xsl:apply-templates mode="forward"/>
102 </xsl:if>
103</xsl:template>
104
105
106<!--
107 * cpp_quote
108-->
109<xsl:template match="cpp">
110 <xsl:text>cpp_quote("</xsl:text>
111 <xsl:value-of select="@line"/>
112 <xsl:text>")&#x0A;&#x0A;</xsl:text>
113</xsl:template>
114
115
116<!--
117 * #if statement (@if attribute)
118-->
119<xsl:template match="@if" mode="begin">
120 <xsl:text>#if </xsl:text>
121 <xsl:value-of select="."/>
122 <xsl:text>&#x0A;</xsl:text>
123</xsl:template>
124<xsl:template match="@if" mode="end">
125 <xsl:text>#endif&#x0A;</xsl:text>
126</xsl:template>
127
128
129<!--
130 * libraries
131-->
132<xsl:template match="library">[
133 uuid(<xsl:value-of select="@uuid"/>),
134 version(<xsl:value-of select="@version"/>),
135 helpstring("<xsl:value-of select="@desc"/>")
136]
137<xsl:text>library </xsl:text>
138 <xsl:value-of select="@name"/>
139 <xsl:text>&#x0A;{&#x0A;</xsl:text>
140 <xsl:text>&#x0A;importlib("stdole2.tlb");&#x0A;&#x0A;</xsl:text>
141 <!-- forward declarations -->
142 <xsl:apply-templates select="if | interface | collection | enumerator" mode="forward"/>
143 <xsl:text>&#x0A;</xsl:text>
144 <!-- all enums go first -->
145 <xsl:apply-templates select="enum | if/enum"/>
146 <!-- everything else but enums -->
147 <xsl:apply-templates select="*[not(self::enum) and not(self::if[enum])]"/>
148 <!-- -->
149 <xsl:text>}; /* library </xsl:text>
150 <xsl:value-of select="@name"/>
151 <xsl:text> */&#x0A;&#x0A;</xsl:text>
152</xsl:template>
153
154
155<!--
156 * forward declarations
157-->
158<xsl:template match="interface | collection | enumerator" mode="forward">
159 <xsl:text>interface </xsl:text>
160 <xsl:value-of select="@name"/>
161 <xsl:text>;&#x0A;</xsl:text>
162</xsl:template>
163
164
165<!--
166 * interfaces
167-->
168<xsl:template match="interface">[
169 uuid(<xsl:value-of select="@uuid"/>),
170 object,
171 dual
172]
173<xsl:text>interface </xsl:text>
174 <xsl:value-of select="@name"/>
175 <xsl:text> : </xsl:text>
176 <xsl:choose>
177 <xsl:when test="@extends='$unknown'">IUnknown</xsl:when>
178 <xsl:when test="@extends='$dispatched'">IDispatch</xsl:when>
179 <xsl:when test="@extends='$errorinfo'">IErrorInfo</xsl:when>
180 <xsl:otherwise><xsl:value-of select="@extends"/></xsl:otherwise>
181 </xsl:choose>
182 <xsl:text>&#x0A;{&#x0A;</xsl:text>
183 <!-- attributes (properties) -->
184 <xsl:apply-templates select="attribute"/>
185 <!-- methods -->
186 <xsl:apply-templates select="method"/>
187 <!-- 'if' enclosed elements, unsorted -->
188 <xsl:apply-templates select="if"/>
189 <!-- -->
190 <xsl:text>}; /* interface </xsl:text>
191 <xsl:value-of select="@name"/>
192 <xsl:text> */&#x0A;&#x0A;</xsl:text>
193</xsl:template>
194
195
196<!--
197 * attributes
198-->
199<xsl:template match="interface//attribute | collection//attribute">
200 <xsl:apply-templates select="@if" mode="begin"/>
201 <xsl:if test="@array">
202 <xsl:message terminate="yes">
203 <xsl:value-of select="concat(../@name,'::',@name,': ')"/>
204 <xsl:text>'array' attributes are not supported, use 'safearray="yes"' instead.</xsl:text>
205 </xsl:message>
206 </xsl:if>
207 <!-- getter -->
208 <xsl:text> [propget] HRESULT </xsl:text>
209 <xsl:call-template name="capitalize">
210 <xsl:with-param name="str" select="@name"/>
211 </xsl:call-template>
212 <xsl:text> ([out, retval] </xsl:text>
213 <xsl:if test="@safearray='yes'">
214 <xsl:text>SAFEARRAY(</xsl:text>
215 </xsl:if>
216 <xsl:apply-templates select="@type"/>
217 <xsl:if test="@safearray='yes'">
218 <xsl:text>)</xsl:text>
219 </xsl:if>
220 <xsl:text> * a</xsl:text>
221 <xsl:call-template name="capitalize">
222 <xsl:with-param name="str" select="@name"/>
223 </xsl:call-template>
224 <xsl:text>);&#x0A;</xsl:text>
225 <!-- setter -->
226 <xsl:if test="not(@readonly='yes')">
227 <xsl:text> [propput] HRESULT </xsl:text>
228 <xsl:call-template name="capitalize">
229 <xsl:with-param name="str" select="@name"/>
230 </xsl:call-template>
231 <xsl:text> ([in</xsl:text>
232 <xsl:if test="@safearray='yes'">
233 <!-- VB supports only [in, out], [out] and [out, retval] arrays -->
234 <xsl:text>, out</xsl:text>
235 </xsl:if>
236 <xsl:text>] </xsl:text>
237 <xsl:if test="@safearray='yes'">
238 <xsl:text>SAFEARRAY(</xsl:text>
239 </xsl:if>
240 <xsl:apply-templates select="@type"/>
241 <xsl:if test="@safearray='yes'">
242 <xsl:text>) *</xsl:text>
243 </xsl:if>
244 <xsl:text> a</xsl:text>
245 <xsl:call-template name="capitalize">
246 <xsl:with-param name="str" select="@name"/>
247 </xsl:call-template>
248 <xsl:text>);&#x0A;</xsl:text>
249 </xsl:if>
250 <xsl:apply-templates select="@if" mode="end"/>
251 <xsl:text>&#x0A;</xsl:text>
252</xsl:template>
253
254
255<!--
256 * methods
257-->
258<xsl:template match="interface//method | collection//method">
259 <xsl:apply-templates select="@if" mode="begin"/>
260 <xsl:text> HRESULT </xsl:text>
261 <xsl:call-template name="capitalize">
262 <xsl:with-param name="str" select="@name"/>
263 </xsl:call-template>
264 <xsl:if test="param">
265 <xsl:text> (&#x0A;</xsl:text>
266 <xsl:for-each select="param [position() != last()]">
267 <xsl:text> </xsl:text>
268 <xsl:apply-templates select="."/>
269 <xsl:text>,&#x0A;</xsl:text>
270 </xsl:for-each>
271 <xsl:text> </xsl:text>
272 <xsl:apply-templates select="param [last()]"/>
273 <xsl:text>&#x0A; );&#x0A;</xsl:text>
274 </xsl:if>
275 <xsl:if test="not(param)">
276 <xsl:text>();&#x0A;</xsl:text>
277 </xsl:if>
278 <xsl:apply-templates select="@if" mode="end"/>
279 <xsl:text>&#x0A;</xsl:text>
280</xsl:template>
281
282
283<!--
284 * co-classes
285-->
286<xsl:template match="module/class">[
287 uuid(<xsl:value-of select="@uuid"/>)
288]
289<xsl:text>coclass </xsl:text>
290 <xsl:value-of select="@name"/>
291 <xsl:text>&#x0A;{&#x0A;</xsl:text>
292 <xsl:for-each select="interface">
293 <xsl:text> </xsl:text>
294 <xsl:if test="@default='yes'">
295 <xsl:text>[default] </xsl:text>
296 </xsl:if>
297 <xsl:text>interface </xsl:text>
298 <xsl:value-of select="@name"/>
299 <xsl:text>;&#x0A;</xsl:text>
300 </xsl:for-each>
301 <xsl:text>&#x0A;}; /* coclass </xsl:text>
302 <xsl:value-of select="@name"/>
303 <xsl:text> */&#x0A;&#x0A;</xsl:text>
304</xsl:template>
305
306
307<!--
308 * enumerators
309-->
310<xsl:template match="enumerator">[
311 uuid(<xsl:value-of select="@uuid"/>),
312 object,
313 dual
314]
315<xsl:text>interface </xsl:text>
316 <xsl:value-of select="@name"/>
317 <xsl:text> : IUnknown&#x0A;{&#x0A;</xsl:text>
318 <!-- HasMore -->
319 <xsl:text> HRESULT HasMore ([out, retval] BOOL * more);&#x0A;&#x0A;</xsl:text>
320 <!-- GetNext -->
321 <xsl:text> HRESULT GetNext ([out, retval] </xsl:text>
322 <xsl:apply-templates select="@type"/>
323 <xsl:text> * next);&#x0A;&#x0A;</xsl:text>
324 <!-- -->
325 <xsl:text>&#x0A;}; /* interface </xsl:text>
326 <xsl:value-of select="@name"/>
327 <xsl:text> */&#x0A;&#x0A;</xsl:text>
328</xsl:template>
329
330
331<!--
332 * collections
333-->
334<xsl:template match="collection">
335 <xsl:if test="not(@readonly='yes')">
336 <xsl:message terminate="yes">
337 <xsl:value-of select="concat(@name,': ')"/>
338 <xsl:text>non-readonly collections are not currently supported</xsl:text>
339 </xsl:message>
340 </xsl:if>[
341 uuid(<xsl:value-of select="@uuid"/>),
342 object,
343 dual
344]
345<xsl:text>interface </xsl:text>
346 <xsl:value-of select="@name"/>
347 <xsl:text> : IUnknown&#x0A;{&#x0A;</xsl:text>
348 <!-- Count -->
349 <xsl:text> [propget] HRESULT Count ([out, retval] ULONG * count);&#x0A;&#x0A;</xsl:text>
350 <!-- GetItemAt -->
351 <xsl:text> HRESULT GetItemAt ([in] ULONG index, [out, retval] </xsl:text>
352 <xsl:apply-templates select="@type"/>
353 <xsl:text> * item);&#x0A;&#x0A;</xsl:text>
354 <!-- Enumerate -->
355 <xsl:text> HRESULT Enumerate ([out, retval] </xsl:text>
356 <xsl:apply-templates select="@enumerator"/>
357 <xsl:text> * enumerator);&#x0A;&#x0A;</xsl:text>
358 <!-- other extra attributes (properties) -->
359 <xsl:apply-templates select="attribute"/>
360 <!-- other extra methods -->
361 <xsl:apply-templates select="method"/>
362 <!-- 'if' enclosed elements, unsorted -->
363 <xsl:apply-templates select="if"/>
364 <!-- -->
365 <xsl:text>&#x0A;}; /* interface </xsl:text>
366 <xsl:value-of select="@name"/>
367 <xsl:text> */&#x0A;&#x0A;</xsl:text>
368</xsl:template>
369
370
371<!--
372 * enums
373-->
374<xsl:template match="enum">[
375 uuid(<xsl:value-of select="@uuid"/>),
376 v1_enum
377]
378<xsl:text>typedef enum &#x0A;{&#x0A;</xsl:text>
379 <xsl:for-each select="const">
380 <xsl:text> </xsl:text>
381 <xsl:value-of select="concat(../@name,'_',@name)"/> = <xsl:value-of select="@value"/>
382 <xsl:choose>
383 <xsl:when test="position()!=last()"><xsl:text>,&#x0A;</xsl:text></xsl:when>
384 <xsl:otherwise><xsl:text>&#x0A;</xsl:text></xsl:otherwise>
385 </xsl:choose>
386 </xsl:for-each>
387 <xsl:text>} </xsl:text>
388 <xsl:value-of select="@name"/>
389 <xsl:text>;&#x0A;&#x0A;</xsl:text>
390 <!-- -->
391 <xsl:value-of select="concat('/* cross-platform type name for ', @name, ' */&#x0A;')"/>
392 <xsl:value-of select="concat('cpp_quote(&quot;#define ', @name, '_T', ' ',
393 @name, '&quot;)&#x0A;&#x0A;')"/>
394 <xsl:text>&#x0A;&#x0A;</xsl:text>
395</xsl:template>
396
397
398<!--
399 * method parameters
400-->
401<xsl:template match="method/param">
402 <xsl:text>[</xsl:text>
403 <xsl:choose>
404 <xsl:when test="@dir='in'">in</xsl:when>
405 <xsl:when test="@dir='out'">out</xsl:when>
406 <xsl:when test="@dir='return'">out, retval</xsl:when>
407 <xsl:otherwise>in</xsl:otherwise>
408 </xsl:choose>
409 <xsl:if test="@safearray='yes'">
410 <!-- VB supports only [in, out], [out] and [out, retval] arrays -->
411 <xsl:if test="@dir='in'">, out</xsl:if>
412 </xsl:if>
413 <xsl:if test="@array">
414 <xsl:if test="@dir='return'">
415 <xsl:message terminate="yes">
416 <xsl:value-of select="concat(../../@name,'::',../@name,'::',@name,': ')"/>
417 <xsl:text>return 'array' parameters are not supported, use 'safearray="yes"' instead.</xsl:text>
418 </xsl:message>
419 </xsl:if>
420 <xsl:choose>
421 <xsl:when test="../param[@name=current()/@array]">
422 <xsl:if test="../param[@name=current()/@array]/@dir != @dir">
423 <xsl:message terminate="yes">
424 <xsl:value-of select="concat(../../@name,'::',../@name,': ')"/>
425 <xsl:value-of select="concat(@name,' and ',../param[@name=current()/@array]/@name)"/>
426 <xsl:text> must have the same direction</xsl:text>
427 </xsl:message>
428 </xsl:if>
429 <xsl:text>, size_is(</xsl:text>
430 <xsl:if test="@dir='out'">
431 <xsl:text>, *</xsl:text>
432 </xsl:if>
433 <xsl:text>a</xsl:text>
434 <xsl:call-template name="capitalize">
435 <xsl:with-param name="str" select="@array"/>
436 </xsl:call-template>
437 <xsl:text>)</xsl:text>
438 </xsl:when>
439 <xsl:otherwise>
440 <xsl:message terminate="yes">
441 <xsl:value-of select="concat(../../@name,'::',../@name,'::',@name,': ')"/>
442 <xsl:text>array attribute refers to non-existent param: </xsl:text>
443 <xsl:value-of select="@array"/>
444 </xsl:message>
445 </xsl:otherwise>
446 </xsl:choose>
447 </xsl:if>
448 <xsl:text>] </xsl:text>
449 <xsl:if test="@safearray='yes'">
450 <xsl:text>SAFEARRAY(</xsl:text>
451 </xsl:if>
452 <xsl:apply-templates select="@type"/>
453 <xsl:if test="@safearray='yes'">
454 <xsl:text>)</xsl:text>
455 </xsl:if>
456 <xsl:if test="@array">
457 <xsl:text> *</xsl:text>
458 </xsl:if>
459 <xsl:if test="@dir='out' or @dir='return' or @safearray='yes'">
460 <xsl:text> *</xsl:text>
461 </xsl:if>
462 <xsl:text> a</xsl:text>
463 <xsl:call-template name="capitalize">
464 <xsl:with-param name="str" select="@name"/>
465 </xsl:call-template>
466</xsl:template>
467
468
469<!--
470 * attribute/parameter type conversion
471-->
472<xsl:template match="
473 attribute/@type | param/@type |
474 enumerator/@type | collection/@type | collection/@enumerator
475">
476 <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
477
478 <xsl:if test="../@array and ../@safearray='yes'">
479 <xsl:message terminate="yes">
480 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
481 <xsl:text>either 'array' or 'safearray="yes"' attribute is allowed, but not both!</xsl:text>
482 </xsl:message>
483 </xsl:if>
484
485 <xsl:choose>
486 <!-- modifiers (ignored for 'enumeration' attributes)-->
487 <xsl:when test="name(current())='type' and ../@mod">
488 <xsl:choose>
489 <xsl:when test="../@mod='ptr'">
490 <xsl:choose>
491 <!-- standard types -->
492 <!--xsl:when test=".='result'">??</xsl:when-->
493 <xsl:when test=".='boolean'">BOOL *</xsl:when>
494 <xsl:when test=".='octet'">BYTE *</xsl:when>
495 <xsl:when test=".='short'">SHORT *</xsl:when>
496 <xsl:when test=".='unsigned short'">USHORT *</xsl:when>
497 <xsl:when test=".='long'">LONG *</xsl:when>
498 <xsl:when test=".='long long'">LONG64 *</xsl:when>
499 <xsl:when test=".='unsigned long'">ULONG *</xsl:when>
500 <xsl:when test=".='unsigned long long'">ULONG64 *</xsl:when>
501 <xsl:when test=".='char'">CHAR *</xsl:when>
502 <!--xsl:when test=".='string'">??</xsl:when-->
503 <xsl:when test=".='wchar'">OLECHAR *</xsl:when>
504 <!--xsl:when test=".='wstring'">??</xsl:when-->
505 <xsl:otherwise>
506 <xsl:message terminate="yes">
507 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
508 <xsl:text>attribute 'mod=</xsl:text>
509 <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
510 <xsl:text>' cannot be used with type </xsl:text>
511 <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
512 </xsl:message>
513 </xsl:otherwise>
514 </xsl:choose>
515 </xsl:when>
516 <xsl:otherwise>
517 <xsl:message terminate="yes">
518 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
519 <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
520 <xsl:text>of attribute 'mod' is invalid!</xsl:text>
521 </xsl:message>
522 </xsl:otherwise>
523 </xsl:choose>
524 </xsl:when>
525 <!-- no modifiers -->
526 <xsl:otherwise>
527 <xsl:choose>
528 <!-- standard types -->
529 <xsl:when test=".='result'">HRESULT</xsl:when>
530 <xsl:when test=".='boolean'">BOOL</xsl:when>
531 <xsl:when test=".='octet'">BYTE</xsl:when>
532 <xsl:when test=".='short'">SHORT</xsl:when>
533 <xsl:when test=".='unsigned short'">USHORT</xsl:when>
534 <xsl:when test=".='long'">LONG</xsl:when>
535 <xsl:when test=".='long long'">LONG64</xsl:when>
536 <xsl:when test=".='unsigned long'">ULONG</xsl:when>
537 <xsl:when test=".='unsigned long long'">ULONG64</xsl:when>
538 <xsl:when test=".='char'">CHAR</xsl:when>
539 <xsl:when test=".='string'">CHAR *</xsl:when>
540 <xsl:when test=".='wchar'">OLECHAR</xsl:when>
541 <xsl:when test=".='wstring'">BSTR</xsl:when>
542 <!-- UUID type -->
543 <xsl:when test=".='uuid'">GUID</xsl:when>
544 <!-- system interface types -->
545 <xsl:when test=".='$unknown'">IUnknown *</xsl:when>
546 <xsl:otherwise>
547 <xsl:choose>
548 <!-- enum types -->
549 <xsl:when test="
550 (ancestor::library/enum[@name=current()]) or
551 (ancestor::library/if[@target=$self_target]/enum[@name=current()])
552 ">
553 <xsl:value-of select="."/>
554 </xsl:when>
555 <!-- custom interface types -->
556 <xsl:when test="
557 (name(current())='enumerator' and
558 ((ancestor::library/enumerator[@name=current()]) or
559 (ancestor::library/if[@target=$self_target]/enumerator[@name=current()]))
560 ) or
561 ((ancestor::library/interface[@name=current()]) or
562 (ancestor::library/if[@target=$self_target]/interface[@name=current()])
563 ) or
564 ((ancestor::library/collection[@name=current()]) or
565 (ancestor::library/if[@target=$self_target]/collection[@name=current()])
566 )
567 ">
568 <xsl:value-of select="."/><xsl:text> *</xsl:text>
569 </xsl:when>
570 <!-- other types -->
571 <xsl:otherwise>
572 <xsl:message terminate="yes">
573 <xsl:text>Unknown parameter type: </xsl:text>
574 <xsl:value-of select="."/>
575 </xsl:message>
576 </xsl:otherwise>
577 </xsl:choose>
578 </xsl:otherwise>
579 </xsl:choose>
580 </xsl:otherwise>
581 </xsl:choose>
582</xsl:template>
583
584</xsl:stylesheet>
585
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette