Commit 454d3d3bc4cd45789a167dc726cbbbc6a36e08d1
1 parent
5faef42e
Exists in
master
and in
7 other branches
Inclusão da biblioteca cswclient
Showing
17 changed files
with
2864 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,115 @@ |
1 | +<?php | |
2 | +// PHP CSW Proxy for CSW services. | |
3 | +// Responds to both HTTP GET and POST requests | |
4 | +// | |
5 | +// Author: Rob van Swol, NLR | |
6 | +// October 15th, 2008 | |
7 | +// | |
8 | + | |
9 | +$logging = false; | |
10 | +/* Optionally write all requests in a log file */ | |
11 | +if ($logging) { | |
12 | + $fh = fopen("lib/proxy.log", "ab+"); | |
13 | + $timestamp = strftime("[%Y-%m-%d %H:%M:%S]"); | |
14 | +} | |
15 | + | |
16 | +$allowed_hosts = array(); | |
17 | + | |
18 | +$doc = new DOMDocument(); | |
19 | +$doc->load('./lib/xml/csw-hosts.xml'); | |
20 | + | |
21 | +$hosts = $doc->getElementsByTagName("option"); | |
22 | +foreach ($hosts as $host) { | |
23 | + //$csw_host_id = trim($host->nodeValue); | |
24 | + $csw_host = trim($host->getAttribute("value")); | |
25 | + //echo $csw_host."\n"; | |
26 | + array_push($allowed_hosts, $csw_host); | |
27 | +} | |
28 | + | |
29 | + | |
30 | +// Get the REST call path from the AJAX application | |
31 | +// Is it a POST or a GET? | |
32 | +$url = ($_POST['csw_host']) ? $_POST['csw_host'] : $_GET['csw_host']; | |
33 | + | |
34 | +// Check if $url is a known host | |
35 | +if (!in_array($url, $allowed_hosts)) { | |
36 | + echo "not allowed"; | |
37 | + if ($logging) { | |
38 | + fwrite($fh, $timestamp.": refused request...\n"); | |
39 | + fwrite($fh, $timestamp.": HOST NOT ALLOWED> ".$url."\n"); | |
40 | + } | |
41 | +} else { | |
42 | + | |
43 | +if ($logging) { | |
44 | + fwrite($fh, $timestamp.": incoming request...\n"); | |
45 | + fwrite($fh, $timestamp.": HOST> ".$url."\n"); | |
46 | +} | |
47 | + | |
48 | +// Open the Curl session | |
49 | +$session = curl_init($url); | |
50 | + | |
51 | +// If it's a POST, put the POST data in the body | |
52 | +if ($_POST['csw_request']) { | |
53 | + | |
54 | + //if (substr($_POST['csw_request'],0,5) == "<?xml") { | |
55 | + if (substr($_POST['csw_request'],0,1) == "<") { | |
56 | + | |
57 | + // Is magic quotes on? | |
58 | + if (get_magic_quotes_gpc()) | |
59 | + $xmlpost = stripslashes($_POST['csw_request']); | |
60 | + else | |
61 | + $xmlpost = $_POST['csw_request']; | |
62 | + | |
63 | + curl_setopt ($session, CURLOPT_POST, true); | |
64 | + curl_setopt ($session, CURLOPT_POSTFIELDS, $xmlpost); | |
65 | + curl_setopt ($session, CURLOPT_HTTPHEADER, Array("Content-Type: application/xml")); | |
66 | + //curl_setopt ($session, CURLOPT_SSL_VERIFYPEER, 0); | |
67 | + if ($logging) | |
68 | + fwrite($fh, $timestamp.": POST> ".$xmlpost."\n"); | |
69 | + | |
70 | + } else { | |
71 | + $postvars = ''; | |
72 | + while ($element = current($_POST)) { | |
73 | + if (key($_POST) != "csw_request") | |
74 | + $postvars .= key($_POST).'='.$element.'&'; | |
75 | + else | |
76 | + $postvars .= $element.'&'; | |
77 | + next($_POST); | |
78 | + } | |
79 | + curl_setopt ($session, CURLOPT_POST, true); | |
80 | + curl_setopt ($session, CURLOPT_POSTFIELDS, $_POST['csw_request']); | |
81 | + curl_setopt ($session, CURLOPT_HTTPHEADER, Array("Content-Type: application/x-www-form-urlencoded")); | |
82 | + if ($logging) | |
83 | + fwrite($fh, $timestamp.": POST> ".$_POST['csw_request']."\n"); | |
84 | + } | |
85 | + | |
86 | +} else if ($_GET['csw_request']) { | |
87 | + curl_setopt ($session, CURLOPT_POST, true); | |
88 | + curl_setopt ($session, CURLOPT_POSTFIELDS, $_GET['csw_request']); | |
89 | + curl_setopt ($session, CURLOPT_HTTPHEADER, Array("Content-Type: application/x-www-form-urlencoded")); | |
90 | + if ($logging) | |
91 | + fwrite($fh, $timestamp.": GET> ".$_GET['csw_request']."\n"); | |
92 | +} | |
93 | + | |
94 | + | |
95 | + | |
96 | +// Don't return HTTP headers. Do return the contents of the call | |
97 | +curl_setopt($session, CURLOPT_HEADER, false); | |
98 | +curl_setopt($session, CURLOPT_RETURNTRANSFER, true); | |
99 | + | |
100 | + | |
101 | +// Make the call | |
102 | +$xml = curl_exec($session); | |
103 | + | |
104 | +// The web service returns XML. Set the Content-Type appropriately | |
105 | +header("Content-Type: text/xml"); | |
106 | + | |
107 | +if ($logging) { | |
108 | + fwrite($fh, $timestamp.": RESPONSE> ".$xml."\n"); | |
109 | + fclose($fh); | |
110 | +} | |
111 | + | |
112 | +echo $xml; | |
113 | +curl_close($session); | |
114 | +} | |
115 | +?> | ... | ... |
... | ... | @@ -0,0 +1,29 @@ |
1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |
2 | +<html> | |
3 | +<head> | |
4 | +<title>Simple CSW CLient</title> | |
5 | +<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> | |
6 | + | |
7 | +<link rel="stylesheet" type="text/css" href="lib/css/cswclient.css"/> | |
8 | + | |
9 | +<script type="text/javascript" src="./lib/scripts/sarissa.js"></script> | |
10 | +<script type="text/javascript" src="./lib/scripts/sarissa_ieemu_xpath.js"></script> | |
11 | +<script type="text/javascript" src="./lib/scripts/cswclient.js"></script> | |
12 | + | |
13 | +</head> | |
14 | +<body> | |
15 | + | |
16 | + <div class="csw-wrapper" id="csw-wrapper" style="width:80%"> | |
17 | + <script type="text/javascript"> | |
18 | + //var cswhost = "http://geomatics.nlr.nl/excat/csw";//default host | |
19 | + //var host = "http://myhost.nlr.nl/cswclient/"; // path to proxy directory if different from path to csw.html | |
20 | + //var csw_client = new CSWClient(cswhost, host); // if not using default settings | |
21 | + //var csw_client = new CSWClient("http://geonovum.nitg.tno.nl/geonetwork/srv/en/csw"); | |
22 | + var csw_client = new CSWClient(); | |
23 | + csw_client.writeClient("csw-wrapper"); | |
24 | + //csw_client.useProxy(false); // default=true | |
25 | + </script> | |
26 | + </div><!-- wrapper --> | |
27 | + | |
28 | +</body> | |
29 | +</html> | ... | ... |
No preview for this file type
... | ... | @@ -0,0 +1,210 @@ |
1 | +/* | |
2 | +* File : cswclient.css | |
3 | +* Author : Rob van Swol | |
4 | +* Organisation: National Aerospace Laboratory NLR | |
5 | +* Country : The Netherlands | |
6 | +* email : vanswol@nlr.nl | |
7 | +* Description: CSS Stylesheet for Simple AJAX based CSW client | |
8 | +* Tested on : FireFox 3, Safari, IE 7 | |
9 | +* Last Change : 2008-10-22 | |
10 | +*/ | |
11 | + | |
12 | +/* ********* csw-wrapper ************* */ | |
13 | +.csw-wrapper { | |
14 | + margin: 0; | |
15 | + padding: 0; | |
16 | + font-size: 11px; | |
17 | + font-family: Verdana, Arial, Tahoma, Helvetica, sans-serif; | |
18 | + color: black; | |
19 | + /*min-width: 768px;*/ | |
20 | +} | |
21 | + | |
22 | +.csw-wrapper a, .csw-wrapper a:link, .csw-wrapper a:visited, .csw-wrapper a:active { | |
23 | + text-decoration: none; | |
24 | + padding: 0px; | |
25 | + color: #0063D3; | |
26 | + /*border-bottom: 1px solid #E5ECF3;*/ | |
27 | +} | |
28 | + | |
29 | +.csw-wrapper a:hover { | |
30 | + background-color: #E5ECF3; | |
31 | +} | |
32 | + | |
33 | +#csw-wrapper { | |
34 | + width: 100%; | |
35 | + margin: 0px auto; | |
36 | + clear: both; | |
37 | +} | |
38 | + | |
39 | +#csw-wrapper.home { | |
40 | + text-align: center; | |
41 | +} | |
42 | + | |
43 | +#csw-wrapper.home h3 { | |
44 | + color: #999; | |
45 | +} | |
46 | + | |
47 | +/* ********* clearfix ************* */ | |
48 | +/* | |
49 | + Float fixer: block elements will not encompasss its child nodes | |
50 | + if its children are floated. Apply this class to the block element. | |
51 | + Not a problem in IE. | |
52 | +*/ | |
53 | + | |
54 | +.clearfix:after { | |
55 | + content: "."; | |
56 | + display: block; | |
57 | + height: 0; | |
58 | + clear: both; | |
59 | + visibility: hidden; | |
60 | + } | |
61 | + | |
62 | +* html>body .clearfix { | |
63 | + display: inline-block; | |
64 | + width: 100%; | |
65 | + } | |
66 | + | |
67 | +* html .clearfix { | |
68 | + /* Hides from IE-mac \*/ | |
69 | + height: 1%; | |
70 | + /* End hide from IE-mac */ | |
71 | + } | |
72 | + | |
73 | + | |
74 | + | |
75 | +/* ********* main csw content************* */ | |
76 | + | |
77 | +#cswclient { | |
78 | + clear: both; | |
79 | + margin-top: 1em; | |
80 | +} | |
81 | + | |
82 | + | |
83 | +.csw-main { | |
84 | + border: 1px solid #2e4a6b; | |
85 | + clear: both; | |
86 | + /*background: #E6ECF6;*/ | |
87 | + background: #eef4f9; | |
88 | + padding-top: 2em; | |
89 | +} | |
90 | + | |
91 | +.csw-main2 { | |
92 | + border: 0px solid #2e4a6b; | |
93 | + clear: both; | |
94 | + /*background: #E6ECF6;*/ | |
95 | + padding-top: 2em; | |
96 | +} | |
97 | + | |
98 | +.csw-content { | |
99 | + border: 1px solid #eee; | |
100 | + padding-left: 2em; | |
101 | + padding-right: 2em; | |
102 | + padding-bottom: 2em; | |
103 | + background: #eee url("images/diagonal.gif"); | |
104 | + height: 1%; | |
105 | +} | |
106 | + | |
107 | +.csw-content2 { | |
108 | + padding-left: 2em; | |
109 | + padding-right: 2em; | |
110 | + padding-bottom: 2em; | |
111 | + background: #eee url("images/diagonal.gif"); | |
112 | + height: auto; | |
113 | +} | |
114 | + | |
115 | +.meta | |
116 | + { vertical-align: top; | |
117 | + } | |
118 | + | |
119 | +.meta-param | |
120 | + { vertical-align: top; | |
121 | + color: #004393 | |
122 | + } | |
123 | + | |
124 | +.meta-value | |
125 | + { vertical-align: top; | |
126 | + } | |
127 | + | |
128 | +h3 { | |
129 | + font-size: 1.1em; | |
130 | + color: #21507B; | |
131 | + margin-top: 0.6em; | |
132 | +} | |
133 | + | |
134 | +dl{ margin: 0px; padding: 0px;} | |
135 | + | |
136 | +dd{ margin: 0px; padding-left: 2em;} | |
137 | + | |
138 | +li { margin-bottom: 0.3em; } | |
139 | + | |
140 | + | |
141 | + | |
142 | +/* ********* captioneddiv************* */ | |
143 | + | |
144 | +.captioneddiv | |
145 | + { margin: 2em 0em 0em 0em; | |
146 | + padding: 1em; | |
147 | + height:100px; | |
148 | + border: solid #2e4a6b 1px; | |
149 | + background: #ffffff; | |
150 | + } | |
151 | + | |
152 | +html>body .captioneddiv | |
153 | + { margin: 2em 0em 0em 0em; | |
154 | + padding: 1em; | |
155 | + height:auto; | |
156 | + border: solid #2e4a6b 1px; | |
157 | + background: #ffffff; | |
158 | + } | |
159 | + | |
160 | +.captioneddiv h3 | |
161 | + { position: relative; | |
162 | + margin: 0.5em; | |
163 | + top: -2.0em; | |
164 | + left: -1.0em; | |
165 | + padding: 0em 0.5em; | |
166 | + display: inline; | |
167 | + font-size: 0.9em; | |
168 | + /*background: #cae1ff;*/ | |
169 | + background: #ffffff; | |
170 | + } | |
171 | + | |
172 | +#popup | |
173 | + { visibility:hidden; | |
174 | + z-index:100; | |
175 | + width: 600px; | |
176 | + height: 500px; | |
177 | + left: 200px; | |
178 | + position: absolute; | |
179 | + background: #eee url("images/diagonal.gif"); | |
180 | + border: 1px solid #2e4a6b; | |
181 | + } | |
182 | + | |
183 | +#popup2 | |
184 | + { height:500px; | |
185 | + overflow:auto; | |
186 | + position: relative; | |
187 | + } | |
188 | + | |
189 | +.close | |
190 | + { position: relative; | |
191 | + top: 0px; | |
192 | + left: 0px; | |
193 | + padding: 3px; | |
194 | + color: #ffffff; | |
195 | + background: #2e4a6b; | |
196 | + z-index:101; | |
197 | + } | |
198 | + | |
199 | +.close a, .close a:link, .close a:visited, .close a:active .close a:hover { | |
200 | + text-decoration: none; | |
201 | + padding: 0px; | |
202 | + color: #ffffff; | |
203 | +} | |
204 | + | |
205 | +.close a:hover { | |
206 | + background-color: #E5ECF3; | |
207 | + color: #2e4a6b; | |
208 | + border: solid #2e4a6b 1px | |
209 | +} | |
210 | + | ... | ... |
815 Bytes
... | ... | @@ -0,0 +1,345 @@ |
1 | +/* | |
2 | +* File : CSWClient.js | |
3 | +* Author : Rob van Swol | |
4 | +* Organisation: National Aerospace Laboratory NLR | |
5 | +* Country : The Netherlands | |
6 | +* email : vanswol@nlr.nl | |
7 | +* Description: Simple AJAX based CSW client | |
8 | +* Depends csw-proxy.php | |
9 | +* Tested on : FireFox 3, Safari, IE 7 | |
10 | +* Last Change : 2008-10-22 | |
11 | +*/ | |
12 | + | |
13 | +CSWClient = function(cswhost, host){ | |
14 | + this.cswhost = null; | |
15 | + this.use_proxy = true; | |
16 | + if (typeof cswhost != "undefined") { | |
17 | + this.cswhost = cswhost;} | |
18 | + | |
19 | + this.proxy = "csw-proxy.php"; | |
20 | + if (typeof host != "undefined") { | |
21 | + this.proxy = host + "csw-proxy.php";} | |
22 | + | |
23 | + this.getrecords_xsl = this.loadDocument("lib/xsl/getrecords.xsl"); | |
24 | + this.getrecordbyid_xsl = this.loadDocument("lib/xsl/getrecordbyid.xsl"); | |
25 | + this.defaults_xml = this.loadDocument("lib/xml/defaults.xml"); | |
26 | + this.defaultschema = this.defaults_xml.selectSingleNode("/defaults/outputschema/text()").nodeValue; | |
27 | +} | |
28 | + | |
29 | +CSWClient.prototype.setCSWHost = function(host) | |
30 | +{ | |
31 | + this.cswhost = host; | |
32 | +} | |
33 | + | |
34 | +CSWClient.prototype.useProxy = function(tf) | |
35 | +{ | |
36 | + this.use_proxy = tf; | |
37 | +} | |
38 | + | |
39 | +CSWClient.prototype.writeClient = function(divId) | |
40 | +{ | |
41 | + var client_xml = this.loadDocument("lib/xml/cswclient.xml"); | |
42 | + /* if no default cswhost has been defined we provide the user with optional csw hosts */ | |
43 | + if (this.cswhost == null) { | |
44 | + var cswhosts_xml = this.loadDocument("lib/xml/csw-hosts.xml"); | |
45 | + var span = client_xml.selectSingleNode("//span[@id='csw-hosts']"); | |
46 | + importNode = client_xml.importNode(cswhosts_xml.documentElement, true); | |
47 | + span.appendChild(importNode); | |
48 | + } | |
49 | + var serializer = new XMLSerializer(); | |
50 | + var output = serializer.serializeToString(client_xml); | |
51 | + //alert (output); | |
52 | + var div = document.getElementById(divId); | |
53 | + div.innerHTML = output; | |
54 | +} | |
55 | + | |
56 | +CSWClient.prototype.handleCSWResponse = function(request, xml) | |
57 | +{ | |
58 | + | |
59 | + var stylesheet = "lib/xsl/prettyxml.xsl"; | |
60 | + if (request == "getrecords" & | |
61 | + document.theForm.displaymode.value != "xml") { | |
62 | + stylesheet = "lib/xsl/csw-results.xsl"; | |
63 | + } else if (request == "getrecordbyid" & | |
64 | + document.theForm.displaymode.value != "xml") { | |
65 | + stylesheet = "lib/xsl/csw-metadata.xsl"; | |
66 | + } | |
67 | + | |
68 | + xslt = this.loadDocument(stylesheet); | |
69 | + var processor = new XSLTProcessor(); | |
70 | + processor.importStylesheet(xslt); | |
71 | + | |
72 | + var XmlDom = processor.transformToDocument(xml) | |
73 | + var serializer = new XMLSerializer(); | |
74 | + var output = serializer.serializeToString(XmlDom.documentElement); | |
75 | + | |
76 | + var outputDiv = document.getElementById("csw-output"); | |
77 | + if (request == "getrecordbyid"){ | |
78 | + outputDiv = document.getElementById("metadata"); | |
79 | + //this.positionDiv(document.getElementById('popup'), document.getElementById('results')) | |
80 | + //this.positionPopUp(document.getElementById('popup'), document.getElementById('results')) | |
81 | + this.positionPopUp(document.getElementById('popup'), document.getElementById('cswclient')) | |
82 | + this.showDiv(document.getElementById('popup')); | |
83 | + } | |
84 | + outputDiv.innerHTML = output; | |
85 | +} | |
86 | + | |
87 | + | |
88 | +CSWClient.prototype.getRecords = function(start) | |
89 | +{ | |
90 | + | |
91 | + if (typeof start == "undefined") { | |
92 | + start = 1;} | |
93 | + | |
94 | + if (typeof document.theForm.cswhosts != "undefined") { | |
95 | + this.setCSWHost(document.theForm.cswhosts.value);} | |
96 | + | |
97 | + var queryable = document.theForm.queryable.value; | |
98 | + | |
99 | + /*because geonetwork doen not follow the specs*/ | |
100 | + if(this.cswhost.indexOf('geonetwork') !=-1 & queryable == "anytext") | |
101 | + queryable = "any"; | |
102 | + | |
103 | + var operator = document.theForm.operator.value; | |
104 | + var query = trim(document.theForm.query.value); | |
105 | + if (operator == "contains" & query != "") {query = "%" + query + "%";} | |
106 | + | |
107 | + var schema = "http://www.opengis.net/cat/csw/2.0.2"; // force outputSchema always to csw:Record for GetRecords requests | |
108 | + this.setXpathValue(this.defaults_xml, "/defaults/outputschema", schema + ''); | |
109 | + this.setXpathValue(this.defaults_xml, "/defaults/propertyname", queryable + ''); | |
110 | + this.setXpathValue(this.defaults_xml, "/defaults/literal", query + ''); | |
111 | + //this.setXpathValue(defaults_xml, "/this.defaults/literal", query + ''); | |
112 | + this.setXpathValue(this.defaults_xml, "/defaults/startposition", start + ''); | |
113 | + var sortby = document.theForm.sortby.value; | |
114 | + this.setXpathValue(this.defaults_xml, "/defaults/sortby", sortby + ''); | |
115 | + | |
116 | + var processor = new XSLTProcessor(); | |
117 | + processor.importStylesheet(this.getrecords_xsl); | |
118 | + | |
119 | + var request_xml = processor.transformToDocument(this.defaults_xml); | |
120 | + var request = new XMLSerializer().serializeToString(request_xml); | |
121 | + | |
122 | + csw_response = this.sendCSWRequest(request); | |
123 | + var results = "<results><request start=\"" + start + "\""; | |
124 | + results += " maxrecords=\""; | |
125 | + results += this.defaults_xml.selectSingleNode("/defaults/maxrecords/text()").nodeValue; | |
126 | + results += "\"/></results>"; | |
127 | + | |
128 | + results_xml = (new DOMParser()).parseFromString(results, "text/xml"); | |
129 | + importNode = results_xml.importNode(csw_response.documentElement, true); | |
130 | + results_xml.documentElement.appendChild(importNode); | |
131 | + //alert(new XMLSerializer().serializeToString(results_xml)); | |
132 | + | |
133 | + //return handleCSWResponse("getrecords", csw_response); | |
134 | + return this.handleCSWResponse("getrecords", results_xml); | |
135 | +} | |
136 | + | |
137 | + | |
138 | +CSWClient.prototype.getRecordById = function(id) | |
139 | +{ | |
140 | + | |
141 | + var schema = this.defaultschema; | |
142 | + if (document.theForm.schema != null) { | |
143 | + schema = document.theForm.schema.value; | |
144 | + } | |
145 | + | |
146 | + this.setXpathValue(this.defaults_xml, "/defaults/outputschema", schema + ''); | |
147 | + this.setXpathValue(this.defaults_xml, "/defaults/id", id + ''); | |
148 | + | |
149 | + var processor = new XSLTProcessor(); | |
150 | + processor.importStylesheet(this.getrecordbyid_xsl); | |
151 | + | |
152 | + var request_xml = processor.transformToDocument(this.defaults_xml); | |
153 | + var request = new XMLSerializer().serializeToString(request_xml); | |
154 | + | |
155 | + csw_response = this.sendCSWRequest(request); | |
156 | + //alert(new XMLSerializer().serializeToString(csw_response)); | |
157 | + return this.handleCSWResponse("getrecordbyid", csw_response); | |
158 | +} | |
159 | + | |
160 | + | |
161 | +CSWClient.prototype.sendCSWRequest = function(request) | |
162 | +{ | |
163 | + | |
164 | + var xml = Sarissa.getDomDocument(); | |
165 | + xml.async = false; | |
166 | + var xmlhttp = new XMLHttpRequest(); | |
167 | + | |
168 | + var params; | |
169 | + if (this.use_proxy) { | |
170 | + params = "csw_host=" + this.cswhost + "&csw_request=" + encodeURIComponent(request); | |
171 | + xmlhttp.open("POST", this.proxy, false); | |
172 | + xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); | |
173 | + } else { | |
174 | + params = request; | |
175 | + xmlhttp.open("POST", this.cswhost, false); | |
176 | + xmlhttp.setRequestHeader("Content-type", "application/xml"); | |
177 | + } | |
178 | + | |
179 | + //xmlhttp.open("POST", this.proxy, false); | |
180 | + //xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); | |
181 | + //xmlhttp.open("POST", this.cswhost, false); | |
182 | + //xmlhttp.setRequestHeader("Content-type", "application/xml"); | |
183 | + xmlhttp.setRequestHeader("Content-length", params.length); | |
184 | + xmlhttp.setRequestHeader("Connection", "close"); | |
185 | + xmlhttp.send(params); // POST | |
186 | + //xmlhttp.send(''); //GET | |
187 | + | |
188 | + xml = xmlhttp.responseXML; | |
189 | + return xml; | |
190 | +} | |
191 | + | |
192 | + | |
193 | +CSWClient.prototype.loadDocument = function(uri) | |
194 | +{ | |
195 | + | |
196 | + var xml = Sarissa.getDomDocument(); | |
197 | + var xmlhttp = new XMLHttpRequest(); | |
198 | + xml.async = false; | |
199 | + xmlhttp.open("GET", uri, false); | |
200 | + xmlhttp.send(''); | |
201 | + xml = xmlhttp.responseXML; | |
202 | + return xml; | |
203 | +} | |
204 | + | |
205 | + | |
206 | +CSWClient.prototype.setXpathValue = function(_a,_b,_c) | |
207 | +{ | |
208 | + | |
209 | + var _e=_a.selectSingleNode(_b); | |
210 | + if(_e){ | |
211 | + if(_e.firstChild){ | |
212 | + _e.firstChild.nodeValue=_c; | |
213 | + }else{ | |
214 | + dom=Sarissa.getDomDocument(); | |
215 | + v=dom.createTextNode(_c); | |
216 | + _e.appendChild(v); | |
217 | + } | |
218 | + return true; | |
219 | + }else{ | |
220 | + return false; | |
221 | + } | |
222 | +}; | |
223 | + | |
224 | + | |
225 | +CSWClient.prototype.clearPage = function() | |
226 | +{ | |
227 | + document.theForm.query.value = ""; | |
228 | + var outputDiv = document.getElementById("csw-output"); | |
229 | + outputDiv.innerHTML = ""; | |
230 | + this.hideDiv(document.getElementById('popup')) | |
231 | +} | |
232 | + | |
233 | +CSWClient.prototype.overlayDiv = function(div) | |
234 | +{ | |
235 | + while (div.tagName !="DIV") { | |
236 | + div = div.parentNode | |
237 | + } | |
238 | + | |
239 | + _width = div.offsetWidth | |
240 | + _height = div.offsetHeight | |
241 | + _top = this.findPosY(div); | |
242 | + _left = this.findPosX(div); | |
243 | + | |
244 | + //overlay = document.createElement("div") | |
245 | + //overlay.setAttribute("id", "overlay") | |
246 | + var overlay = document.getElementById('overlay'); | |
247 | + overlay.style.width = _width + "px" | |
248 | + overlay.style.height = _height + "px" | |
249 | + overlay.style.position = "absolute" | |
250 | + overlay.style.background = "#555555" | |
251 | + overlay.style.top = _top + "px" | |
252 | + overlay.style.left = _left + "px" | |
253 | + | |
254 | + overlay.style.filter = "alpha(opacity=70)" | |
255 | + overlay.style.opacity = "0.7" | |
256 | + overlay.style.mozOpacity = "0.7" | |
257 | + overlay.style.visibility="visible"; | |
258 | + | |
259 | + document.getElementsByTagName("body")[0].appendChild(overlay) | |
260 | +} | |
261 | + | |
262 | +CSWClient.prototype.removeDiv = function(div) | |
263 | +{ | |
264 | + document.getElementsByTagName("body")[0].removeChild(div) | |
265 | +} | |
266 | + | |
267 | +CSWClient.prototype.hideDiv = function(div) | |
268 | +{ | |
269 | + document.getElementById('overlay').style.visibility="hidden"; | |
270 | + div.style.visibility="hidden"; | |
271 | +} | |
272 | + | |
273 | +CSWClient.prototype.showDiv = function(div) | |
274 | +{ | |
275 | + //this.overlayDiv(document.getElementById('results-container')); | |
276 | + this.overlayDiv(document.getElementById('cswclient')); | |
277 | + div.style.visibility="visible"; | |
278 | +} | |
279 | + | |
280 | +CSWClient.prototype.positionDiv = function(div1, div2) | |
281 | +{ | |
282 | + var width = div2.offsetWidth-100 | |
283 | + var height = div2.offsetHeight-100 | |
284 | + var top = this.findPosY(div2)+50; | |
285 | + var left = this.findPosX(div2)+50; | |
286 | + div1.style.width = width + "px" | |
287 | + div1.style.position = "absolute" | |
288 | + div1.style.background = "#ffffff" | |
289 | + div1.style.top = top + "px" | |
290 | + div1.style.left = left + "px" | |
291 | +} | |
292 | + | |
293 | +CSWClient.prototype.positionPopUp = function(div1, div2) | |
294 | +{ | |
295 | + var top = this.findPosY(div2)+50+getScrollY(); | |
296 | + div1.style.top = top + "px" | |
297 | +} | |
298 | + | |
299 | +CSWClient.prototype.findPosX = function(obj) | |
300 | +{ | |
301 | + var curleft = 0; | |
302 | + if(obj.offsetParent) | |
303 | + while(1) { | |
304 | + curleft += obj.offsetLeft; | |
305 | + if(!obj.offsetParent) | |
306 | + break; | |
307 | + obj = obj.offsetParent; | |
308 | + } | |
309 | + else if(obj.x) | |
310 | + curleft += obj.x; | |
311 | + return curleft; | |
312 | +} | |
313 | + | |
314 | +CSWClient.prototype.findPosY = function(obj) | |
315 | +{ | |
316 | + var curtop = 0; | |
317 | + if(obj.offsetParent) | |
318 | + while(1) { | |
319 | + curtop += obj.offsetTop; | |
320 | + if(!obj.offsetParent) | |
321 | + break; | |
322 | + obj = obj.offsetParent; | |
323 | + } | |
324 | + else if(obj.y) | |
325 | + curtop += obj.y; | |
326 | + return curtop; | |
327 | +} | |
328 | + | |
329 | +function getScrollY() | |
330 | +{ | |
331 | + var scrollY = 0; | |
332 | + if (typeof window.pageYOffset == "number") scrollY = window.pageYOffset; | |
333 | + else if (document.documentElement && document.documentElement.scrollTop) | |
334 | + scrollY = document.documentElement.scrollTop; | |
335 | + else if (document.body && document.body.scrollTop) | |
336 | + scrollY = document.body.scrollTop; | |
337 | + else if (window.scrollY) scrollY = window.scrollY; | |
338 | + return scrollY; | |
339 | +} | |
340 | + | |
341 | +function trim(value) { | |
342 | + value = value.replace(/^\s+/,''); | |
343 | + value = value.replace(/\s+$/,''); | |
344 | + return value; | |
345 | +} | ... | ... |
... | ... | @@ -0,0 +1,1025 @@ |
1 | +/* | |
2 | + * ==================================================================== | |
3 | + * About Sarissa: http://dev.abiss.gr/sarissa | |
4 | + * ==================================================================== | |
5 | + * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs. | |
6 | + * The library supports Gecko based browsers like Mozilla and Firefox, | |
7 | + * Internet Explorer (5.5+ with MSXML3.0+), Konqueror, Safari and Opera | |
8 | + * @version 0.9.9.4 | |
9 | + * @author: Copyright 2004-2008 Emmanouil Batsis, mailto: mbatsis at users full stop sourceforge full stop net | |
10 | + * ==================================================================== | |
11 | + * Licence | |
12 | + * ==================================================================== | |
13 | + * Sarissa is free software distributed under the GNU GPL version 2 (see <a href="gpl.txt">gpl.txt</a>) or higher, | |
14 | + * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or higher and Apache Software License 2.0 or higher | |
15 | + * (see <a href="asl.txt">asl.txt</a>). This means you can choose one of the three and use that if you like. If | |
16 | + * you make modifications under the ASL, i would appreciate it if you submitted those. | |
17 | + * In case your copy of Sarissa does not include the license texts, you may find | |
18 | + * them online in various formats at <a href="http://www.gnu.org">http://www.gnu.org</a> and | |
19 | + * <a href="http://www.apache.org">http://www.apache.org</a>. | |
20 | + * | |
21 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | |
22 | + * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE | |
23 | + * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE | |
24 | + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
25 | + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
26 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
27 | + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |
28 | + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
29 | + */ | |
30 | +/** | |
31 | + * <p>Sarissa is a utility class. Provides "static" methods for DOMDocument, | |
32 | + * DOM Node serialization to XML strings and other utility goodies.</p> | |
33 | + * @constructor | |
34 | + * @static | |
35 | + */ | |
36 | +function Sarissa(){} | |
37 | +Sarissa.VERSION = "0.9.9.4"; | |
38 | +Sarissa.PARSED_OK = "Document contains no parsing errors"; | |
39 | +Sarissa.PARSED_EMPTY = "Document is empty"; | |
40 | +Sarissa.PARSED_UNKNOWN_ERROR = "Not well-formed or other error"; | |
41 | +Sarissa.IS_ENABLED_TRANSFORM_NODE = false; | |
42 | +Sarissa.REMOTE_CALL_FLAG = "gr.abiss.sarissa.REMOTE_CALL_FLAG"; | |
43 | +/** @private */ | |
44 | +Sarissa._lastUniqueSuffix = 0; | |
45 | +/** @private */ | |
46 | +Sarissa._getUniqueSuffix = function(){ | |
47 | + return Sarissa._lastUniqueSuffix++; | |
48 | +}; | |
49 | +/** @private */ | |
50 | +Sarissa._SARISSA_IEPREFIX4XSLPARAM = ""; | |
51 | +/** @private */ | |
52 | +Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true; | |
53 | +/** @private */ | |
54 | +Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT = Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument; | |
55 | +/** @private */ | |
56 | +Sarissa._SARISSA_HAS_DOM_FEATURE = Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature; | |
57 | +/** @private */ | |
58 | +Sarissa._SARISSA_IS_MOZ = Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT && Sarissa._SARISSA_HAS_DOM_FEATURE; | |
59 | +/** @private */ | |
60 | +Sarissa._SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("safari") != -1 || navigator.userAgent.toLowerCase().indexOf("konqueror") != -1; | |
61 | +/** @private */ | |
62 | +Sarissa._SARISSA_IS_SAFARI_OLD = Sarissa._SARISSA_IS_SAFARI && (parseInt((navigator.userAgent.match(/AppleWebKit\/(\d+)/)||{})[1], 10) < 420); | |
63 | +/** @private */ | |
64 | +Sarissa._SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1; | |
65 | +/** @private */ | |
66 | +Sarissa._SARISSA_IS_OPERA = navigator.userAgent.toLowerCase().indexOf("opera") != -1; | |
67 | +if(!window.Node || !Node.ELEMENT_NODE){ | |
68 | + Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12}; | |
69 | +} | |
70 | + | |
71 | +//This breaks for(x in o) loops in the old Safari | |
72 | +if(Sarissa._SARISSA_IS_SAFARI_OLD){ | |
73 | + HTMLHtmlElement = document.createElement("html").constructor; | |
74 | + Node = HTMLElement = {}; | |
75 | + HTMLElement.prototype = HTMLHtmlElement.__proto__.__proto__; | |
76 | + HTMLDocument = Document = document.constructor; | |
77 | + var x = new DOMParser(); | |
78 | + XMLDocument = x.constructor; | |
79 | + Element = x.parseFromString("<Single />", "text/xml").documentElement.constructor; | |
80 | + x = null; | |
81 | +} | |
82 | +if(typeof XMLDocument == "undefined" && typeof Document !="undefined"){ XMLDocument = Document; } | |
83 | + | |
84 | +// IE initialization | |
85 | +if(Sarissa._SARISSA_IS_IE){ | |
86 | + // for XSLT parameter names, prefix needed by IE | |
87 | + Sarissa._SARISSA_IEPREFIX4XSLPARAM = "xsl:"; | |
88 | + // used to store the most recent ProgID available out of the above | |
89 | + var _SARISSA_DOM_PROGID = ""; | |
90 | + var _SARISSA_XMLHTTP_PROGID = ""; | |
91 | + var _SARISSA_DOM_XMLWRITER = ""; | |
92 | + /** | |
93 | + * Called when the sarissa.js file is parsed, to pick most recent | |
94 | + * ProgIDs for IE, then gets destroyed. | |
95 | + * @memberOf Sarissa | |
96 | + * @private | |
97 | + * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object | |
98 | + * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled | |
99 | + */ | |
100 | + Sarissa.pickRecentProgID = function (idList){ | |
101 | + // found progID flag | |
102 | + var bFound = false, e; | |
103 | + var o2Store; | |
104 | + for(var i=0; i < idList.length && !bFound; i++){ | |
105 | + try{ | |
106 | + var oDoc = new ActiveXObject(idList[i]); | |
107 | + o2Store = idList[i]; | |
108 | + bFound = true; | |
109 | + }catch (objException){ | |
110 | + // trap; try next progID | |
111 | + e = objException; | |
112 | + } | |
113 | + } | |
114 | + if (!bFound) { | |
115 | + throw "Could not retrieve a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")"; | |
116 | + } | |
117 | + idList = null; | |
118 | + return o2Store; | |
119 | + }; | |
120 | + // pick best available MSXML progIDs | |
121 | + _SARISSA_DOM_PROGID = null; | |
122 | + _SARISSA_THREADEDDOM_PROGID = null; | |
123 | + _SARISSA_XSLTEMPLATE_PROGID = null; | |
124 | + _SARISSA_XMLHTTP_PROGID = null; | |
125 | + // commenting the condition out; we need to redefine XMLHttpRequest | |
126 | + // anyway as IE7 hardcodes it to MSXML3.0 causing version problems | |
127 | + // between different activex controls | |
128 | + //if(!window.XMLHttpRequest){ | |
129 | + /** | |
130 | + * Emulate XMLHttpRequest | |
131 | + * @constructor | |
132 | + */ | |
133 | + XMLHttpRequest = function() { | |
134 | + if(!_SARISSA_XMLHTTP_PROGID){ | |
135 | + _SARISSA_XMLHTTP_PROGID = Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]); | |
136 | + } | |
137 | + return new ActiveXObject(_SARISSA_XMLHTTP_PROGID); | |
138 | + }; | |
139 | + //} | |
140 | + // we dont need this anymore | |
141 | + //============================================ | |
142 | + // Factory methods (IE) | |
143 | + //============================================ | |
144 | + // see non-IE version | |
145 | + Sarissa.getDomDocument = function(sUri, sName){ | |
146 | + if(!_SARISSA_DOM_PROGID){ | |
147 | + _SARISSA_DOM_PROGID = Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"]); | |
148 | + } | |
149 | + var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID); | |
150 | + // if a root tag name was provided, we need to load it in the DOM object | |
151 | + if (sName){ | |
152 | + // create an artifical namespace prefix | |
153 | + // or reuse existing prefix if applicable | |
154 | + var prefix = ""; | |
155 | + if(sUri){ | |
156 | + if(sName.indexOf(":") > 1){ | |
157 | + prefix = sName.substring(0, sName.indexOf(":")); | |
158 | + sName = sName.substring(sName.indexOf(":")+1); | |
159 | + }else{ | |
160 | + prefix = "a" + Sarissa._getUniqueSuffix(); | |
161 | + } | |
162 | + } | |
163 | + // use namespaces if a namespace URI exists | |
164 | + if(sUri){ | |
165 | + oDoc.loadXML('<' + prefix+':'+sName + " xmlns:" + prefix + "=\"" + sUri + "\"" + " />"); | |
166 | + } else { | |
167 | + oDoc.loadXML('<' + sName + " />"); | |
168 | + } | |
169 | + } | |
170 | + return oDoc; | |
171 | + }; | |
172 | + // see non-IE version | |
173 | + Sarissa.getParseErrorText = function (oDoc) { | |
174 | + var parseErrorText = Sarissa.PARSED_OK; | |
175 | + if(oDoc && oDoc.parseError && oDoc.parseError.errorCode && oDoc.parseError.errorCode != 0){ | |
176 | + parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + | |
177 | + "\nLocation: " + oDoc.parseError.url + | |
178 | + "\nLine Number " + oDoc.parseError.line + ", Column " + | |
179 | + oDoc.parseError.linepos + | |
180 | + ":\n" + oDoc.parseError.srcText + | |
181 | + "\n"; | |
182 | + for(var i = 0; i < oDoc.parseError.linepos;i++){ | |
183 | + parseErrorText += "-"; | |
184 | + } | |
185 | + parseErrorText += "^\n"; | |
186 | + } | |
187 | + else if(oDoc.documentElement === null){ | |
188 | + parseErrorText = Sarissa.PARSED_EMPTY; | |
189 | + } | |
190 | + return parseErrorText; | |
191 | + }; | |
192 | + // see non-IE version | |
193 | + Sarissa.setXpathNamespaces = function(oDoc, sNsSet) { | |
194 | + oDoc.setProperty("SelectionLanguage", "XPath"); | |
195 | + oDoc.setProperty("SelectionNamespaces", sNsSet); | |
196 | + }; | |
197 | + /** | |
198 | + * A class that reuses the same XSLT stylesheet for multiple transforms. | |
199 | + * @constructor | |
200 | + */ | |
201 | + XSLTProcessor = function(){ | |
202 | + if(!_SARISSA_XSLTEMPLATE_PROGID){ | |
203 | + _SARISSA_XSLTEMPLATE_PROGID = Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0", "MSXML2.XSLTemplate.3.0"]); | |
204 | + } | |
205 | + this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID); | |
206 | + this.processor = null; | |
207 | + }; | |
208 | + /** | |
209 | + * Imports the given XSLT DOM and compiles it to a reusable transform | |
210 | + * <b>Note:</b> If the stylesheet was loaded from a URL and contains xsl:import or xsl:include elements,it will be reloaded to resolve those | |
211 | + * @param {DOMDocument} xslDoc The XSLT DOMDocument to import | |
212 | + */ | |
213 | + XSLTProcessor.prototype.importStylesheet = function(xslDoc){ | |
214 | + if(!_SARISSA_THREADEDDOM_PROGID){ | |
215 | + _SARISSA_THREADEDDOM_PROGID = Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0", "MSXML2.FreeThreadedDOMDocument.3.0"]); | |
216 | + } | |
217 | + xslDoc.setProperty("SelectionLanguage", "XPath"); | |
218 | + xslDoc.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"); | |
219 | + // convert stylesheet to free threaded | |
220 | + var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); | |
221 | + // make included/imported stylesheets work if exist and xsl was originally loaded from url | |
222 | + try{ | |
223 | + converted.resolveExternals = true; | |
224 | + converted.setProperty("AllowDocumentFunction", true); | |
225 | + } | |
226 | + catch(e){ | |
227 | + // Ignore. "AllowDocumentFunction" is only supported in MSXML 3.0 SP4 and later. | |
228 | + } | |
229 | + if(xslDoc.url && xslDoc.selectSingleNode("//xsl:*[local-name() = 'import' or local-name() = 'include']") != null){ | |
230 | + converted.async = false; | |
231 | + converted.load(xslDoc.url); | |
232 | + } | |
233 | + else { | |
234 | + converted.loadXML(xslDoc.xml); | |
235 | + } | |
236 | + converted.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"); | |
237 | + var output = converted.selectSingleNode("//xsl:output"); | |
238 | + //this.outputMethod = output ? output.getAttribute("method") : "html"; | |
239 | + if(output) { | |
240 | + this.outputMethod = output.getAttribute("method"); | |
241 | + } | |
242 | + else { | |
243 | + delete this.outputMethod; | |
244 | + } | |
245 | + this.template.stylesheet = converted; | |
246 | + this.processor = this.template.createProcessor(); | |
247 | + // for getParameter and clearParameters | |
248 | + this.paramsSet = []; | |
249 | + }; | |
250 | + | |
251 | + /** | |
252 | + * Transform the given XML DOM and return the transformation result as a new DOM document | |
253 | + * @param {DOMDocument} sourceDoc The XML DOMDocument to transform | |
254 | + * @return {DOMDocument} The transformation result as a DOM Document | |
255 | + */ | |
256 | + XSLTProcessor.prototype.transformToDocument = function(sourceDoc){ | |
257 | + // fix for bug 1549749 | |
258 | + var outDoc; | |
259 | + if(_SARISSA_THREADEDDOM_PROGID){ | |
260 | + this.processor.input=sourceDoc; | |
261 | + outDoc=new ActiveXObject(_SARISSA_DOM_PROGID); | |
262 | + this.processor.output=outDoc; | |
263 | + this.processor.transform(); | |
264 | + return outDoc; | |
265 | + } | |
266 | + else{ | |
267 | + if(!_SARISSA_DOM_XMLWRITER){ | |
268 | + _SARISSA_DOM_XMLWRITER = Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0", "Msxml2.MXXMLWriter.3.0", "MSXML2.MXXMLWriter", "MSXML.MXXMLWriter", "Microsoft.XMLDOM"]); | |
269 | + } | |
270 | + this.processor.input = sourceDoc; | |
271 | + outDoc = new ActiveXObject(_SARISSA_DOM_XMLWRITER); | |
272 | + this.processor.output = outDoc; | |
273 | + this.processor.transform(); | |
274 | + var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID); | |
275 | + oDoc.loadXML(outDoc.output+""); | |
276 | + return oDoc; | |
277 | + } | |
278 | + }; | |
279 | + | |
280 | + /** | |
281 | + * Transform the given XML DOM and return the transformation result as a new DOM fragment. | |
282 | + * <b>Note</b>: The xsl:output method must match the nature of the owner document (XML/HTML). | |
283 | + * @param {DOMDocument} sourceDoc The XML DOMDocument to transform | |
284 | + * @param {DOMDocument} ownerDoc The owner of the result fragment | |
285 | + * @return {DOMDocument} The transformation result as a DOM Document | |
286 | + */ | |
287 | + XSLTProcessor.prototype.transformToFragment = function (sourceDoc, ownerDoc) { | |
288 | + this.processor.input = sourceDoc; | |
289 | + this.processor.transform(); | |
290 | + var s = this.processor.output; | |
291 | + var f = ownerDoc.createDocumentFragment(); | |
292 | + var container; | |
293 | + if (this.outputMethod == 'text') { | |
294 | + f.appendChild(ownerDoc.createTextNode(s)); | |
295 | + } else if (ownerDoc.body && ownerDoc.body.innerHTML) { | |
296 | + container = ownerDoc.createElement('div'); | |
297 | + container.innerHTML = s; | |
298 | + while (container.hasChildNodes()) { | |
299 | + f.appendChild(container.firstChild); | |
300 | + } | |
301 | + } | |
302 | + else { | |
303 | + var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID); | |
304 | + if (s.substring(0, 5) == '<?xml') { | |
305 | + s = s.substring(s.indexOf('?>') + 2); | |
306 | + } | |
307 | + var xml = ''.concat('<my>', s, '</my>'); | |
308 | + oDoc.loadXML(xml); | |
309 | + container = oDoc.documentElement; | |
310 | + while (container.hasChildNodes()) { | |
311 | + f.appendChild(container.firstChild); | |
312 | + } | |
313 | + } | |
314 | + return f; | |
315 | + }; | |
316 | + | |
317 | + /** | |
318 | + * Set global XSLT parameter of the imported stylesheet | |
319 | + * @param {String} nsURI The parameter namespace URI | |
320 | + * @param {String} name The parameter base name | |
321 | + * @param {String} value The new parameter value | |
322 | + */ | |
323 | + XSLTProcessor.prototype.setParameter = function(nsURI, name, value){ | |
324 | + // make value a zero length string if null to allow clearing | |
325 | + value = value ? value : ""; | |
326 | + // nsURI is optional but cannot be null | |
327 | + if(nsURI){ | |
328 | + this.processor.addParameter(name, value, nsURI); | |
329 | + }else{ | |
330 | + this.processor.addParameter(name, value); | |
331 | + } | |
332 | + // update updated params for getParameter | |
333 | + nsURI = "" + (nsURI || ""); | |
334 | + if(!this.paramsSet[nsURI]){ | |
335 | + this.paramsSet[nsURI] = []; | |
336 | + } | |
337 | + this.paramsSet[nsURI][name] = value; | |
338 | + }; | |
339 | + /** | |
340 | + * Gets a parameter if previously set by setParameter. Returns null | |
341 | + * otherwise | |
342 | + * @param {String} name The parameter base name | |
343 | + * @param {String} value The new parameter value | |
344 | + * @return {String} The parameter value if reviously set by setParameter, null otherwise | |
345 | + */ | |
346 | + XSLTProcessor.prototype.getParameter = function(nsURI, name){ | |
347 | + nsURI = "" + (nsURI || ""); | |
348 | + if(this.paramsSet[nsURI] && this.paramsSet[nsURI][name]){ | |
349 | + return this.paramsSet[nsURI][name]; | |
350 | + }else{ | |
351 | + return null; | |
352 | + } | |
353 | + }; | |
354 | + | |
355 | + /** | |
356 | + * Clear parameters (set them to default values as defined in the stylesheet itself) | |
357 | + */ | |
358 | + XSLTProcessor.prototype.clearParameters = function(){ | |
359 | + for(var nsURI in this.paramsSet){ | |
360 | + for(var name in this.paramsSet[nsURI]){ | |
361 | + if(nsURI!=""){ | |
362 | + this.processor.addParameter(name, "", nsURI); | |
363 | + }else{ | |
364 | + this.processor.addParameter(name, ""); | |
365 | + } | |
366 | + } | |
367 | + } | |
368 | + this.paramsSet = []; | |
369 | + }; | |
370 | +}else{ /* end IE initialization, try to deal with real browsers now ;-) */ | |
371 | + if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT){ | |
372 | + /** | |
373 | + * <p>Ensures the document was loaded correctly, otherwise sets the | |
374 | + * parseError to -1 to indicate something went wrong. Internal use</p> | |
375 | + * @private | |
376 | + */ | |
377 | + Sarissa.__handleLoad__ = function(oDoc){ | |
378 | + Sarissa.__setReadyState__(oDoc, 4); | |
379 | + }; | |
380 | + /** | |
381 | + * <p>Attached by an event handler to the load event. Internal use.</p> | |
382 | + * @private | |
383 | + */ | |
384 | + _sarissa_XMLDocument_onload = function(){ | |
385 | + Sarissa.__handleLoad__(this); | |
386 | + }; | |
387 | + /** | |
388 | + * <p>Sets the readyState property of the given DOM Document object. | |
389 | + * Internal use.</p> | |
390 | + * @memberOf Sarissa | |
391 | + * @private | |
392 | + * @param oDoc the DOM Document object to fire the | |
393 | + * readystatechange event | |
394 | + * @param iReadyState the number to change the readystate property to | |
395 | + */ | |
396 | + Sarissa.__setReadyState__ = function(oDoc, iReadyState){ | |
397 | + oDoc.readyState = iReadyState; | |
398 | + oDoc.readystate = iReadyState; | |
399 | + if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function") { | |
400 | + oDoc.onreadystatechange(); | |
401 | + } | |
402 | + }; | |
403 | + | |
404 | + Sarissa.getDomDocument = function(sUri, sName){ | |
405 | + var oDoc = document.implementation.createDocument(sUri?sUri:null, sName?sName:null, null); | |
406 | + if(!oDoc.onreadystatechange){ | |
407 | + | |
408 | + /** | |
409 | + * <p>Emulate IE's onreadystatechange attribute</p> | |
410 | + */ | |
411 | + oDoc.onreadystatechange = null; | |
412 | + } | |
413 | + if(!oDoc.readyState){ | |
414 | + /** | |
415 | + * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p> | |
416 | + * <ul><li>1 == LOADING,</li> | |
417 | + * <li>2 == LOADED,</li> | |
418 | + * <li>3 == INTERACTIVE,</li> | |
419 | + * <li>4 == COMPLETED</li></ul> | |
420 | + */ | |
421 | + oDoc.readyState = 0; | |
422 | + } | |
423 | + oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false); | |
424 | + return oDoc; | |
425 | + }; | |
426 | + if(window.XMLDocument){ | |
427 | + // do nothing | |
428 | + }// TODO: check if the new document has content before trying to copynodes, check for error handling in DOM 3 LS | |
429 | + else if(Sarissa._SARISSA_HAS_DOM_FEATURE && window.Document && !Document.prototype.load && document.implementation.hasFeature('LS', '3.0')){ | |
430 | + //Opera 9 may get the XPath branch which gives creates XMLDocument, therefore it doesn't reach here which is good | |
431 | + /** | |
432 | + * <p>Factory method to obtain a new DOM Document object</p> | |
433 | + * @memberOf Sarissa | |
434 | + * @param {String} sUri the namespace of the root node (if any) | |
435 | + * @param {String} sUri the local name of the root node (if any) | |
436 | + * @returns {DOMDOcument} a new DOM Document | |
437 | + */ | |
438 | + Sarissa.getDomDocument = function(sUri, sName){ | |
439 | + var oDoc = document.implementation.createDocument(sUri?sUri:null, sName?sName:null, null); | |
440 | + return oDoc; | |
441 | + }; | |
442 | + } | |
443 | + else { | |
444 | + Sarissa.getDomDocument = function(sUri, sName){ | |
445 | + var oDoc = document.implementation.createDocument(sUri?sUri:null, sName?sName:null, null); | |
446 | + // looks like safari does not create the root element for some unknown reason | |
447 | + if(oDoc && (sUri || sName) && !oDoc.documentElement){ | |
448 | + oDoc.appendChild(oDoc.createElementNS(sUri, sName)); | |
449 | + } | |
450 | + return oDoc; | |
451 | + }; | |
452 | + } | |
453 | + }//if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT) | |
454 | +} | |
455 | +//========================================== | |
456 | +// Common stuff | |
457 | +//========================================== | |
458 | +if(!window.DOMParser){ | |
459 | + if(Sarissa._SARISSA_IS_SAFARI){ | |
460 | + /** | |
461 | + * DOMParser is a utility class, used to construct DOMDocuments from XML strings | |
462 | + * @constructor | |
463 | + */ | |
464 | + DOMParser = function() { }; | |
465 | + /** | |
466 | + * Construct a new DOM Document from the given XMLstring | |
467 | + * @param {String} sXml the given XML string | |
468 | + * @param {String} contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). | |
469 | + * @return {DOMDocument} a new DOM Document from the given XML string | |
470 | + */ | |
471 | + DOMParser.prototype.parseFromString = function(sXml, contentType){ | |
472 | + var xmlhttp = new XMLHttpRequest(); | |
473 | + xmlhttp.open("GET", "data:text/xml;charset=utf-8," + encodeURIComponent(sXml), false); | |
474 | + xmlhttp.send(null); | |
475 | + return xmlhttp.responseXML; | |
476 | + }; | |
477 | + }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() && Sarissa.getDomDocument(null, "bar").xml){ | |
478 | + DOMParser = function() { }; | |
479 | + DOMParser.prototype.parseFromString = function(sXml, contentType){ | |
480 | + var doc = Sarissa.getDomDocument(); | |
481 | + doc.loadXML(sXml); | |
482 | + return doc; | |
483 | + }; | |
484 | + } | |
485 | +} | |
486 | + | |
487 | +if((typeof(document.importNode) == "undefined") && Sarissa._SARISSA_IS_IE){ | |
488 | + try{ | |
489 | + /** | |
490 | + * Implementation of importNode for the context window document in IE. | |
491 | + * If <code>oNode</code> is a TextNode, <code>bChildren</code> is ignored. | |
492 | + * @param {DOMNode} oNode the Node to import | |
493 | + * @param {boolean} bChildren whether to include the children of oNode | |
494 | + * @returns the imported node for further use | |
495 | + */ | |
496 | + document.importNode = function(oNode, bChildren){ | |
497 | + var tmp; | |
498 | + if (oNode.nodeName=='#text') { | |
499 | + return document.createTextNode(oNode.data); | |
500 | + } | |
501 | + else { | |
502 | + if(oNode.nodeName == "tbody" || oNode.nodeName == "tr"){ | |
503 | + tmp = document.createElement("table"); | |
504 | + } | |
505 | + else if(oNode.nodeName == "td"){ | |
506 | + tmp = document.createElement("tr"); | |
507 | + } | |
508 | + else if(oNode.nodeName == "option"){ | |
509 | + tmp = document.createElement("select"); | |
510 | + } | |
511 | + else{ | |
512 | + tmp = document.createElement("div"); | |
513 | + } | |
514 | + if(bChildren){ | |
515 | + tmp.innerHTML = oNode.xml ? oNode.xml : oNode.outerHTML; | |
516 | + }else{ | |
517 | + tmp.innerHTML = oNode.xml ? oNode.cloneNode(false).xml : oNode.cloneNode(false).outerHTML; | |
518 | + } | |
519 | + return tmp.getElementsByTagName("*")[0]; | |
520 | + } | |
521 | + }; | |
522 | + }catch(e){ } | |
523 | +} | |
524 | +if(!Sarissa.getParseErrorText){ | |
525 | + /** | |
526 | + * <p>Returns a human readable description of the parsing error. Usefull | |
527 | + * for debugging. Tip: append the returned error string in a <pre> | |
528 | + * element if you want to render it.</p> | |
529 | + * <p>Many thanks to Christian Stocker for the initial patch.</p> | |
530 | + * @memberOf Sarissa | |
531 | + * @param {DOMDocument} oDoc The target DOM document | |
532 | + * @returns {String} The parsing error description of the target Document in | |
533 | + * human readable form (preformated text) | |
534 | + */ | |
535 | + Sarissa.getParseErrorText = function (oDoc){ | |
536 | + var parseErrorText = Sarissa.PARSED_OK; | |
537 | + if((!oDoc) || (!oDoc.documentElement)){ | |
538 | + parseErrorText = Sarissa.PARSED_EMPTY; | |
539 | + } else if(oDoc.documentElement.tagName == "parsererror"){ | |
540 | + parseErrorText = oDoc.documentElement.firstChild.data; | |
541 | + parseErrorText += "\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data; | |
542 | + } else if(oDoc.getElementsByTagName("parsererror").length > 0){ | |
543 | + var parsererror = oDoc.getElementsByTagName("parsererror")[0]; | |
544 | + parseErrorText = Sarissa.getText(parsererror, true)+"\n"; | |
545 | + } else if(oDoc.parseError && oDoc.parseError.errorCode != 0){ | |
546 | + parseErrorText = Sarissa.PARSED_UNKNOWN_ERROR; | |
547 | + } | |
548 | + return parseErrorText; | |
549 | + }; | |
550 | +} | |
551 | +/** | |
552 | + * Get a string with the concatenated values of all string nodes under the given node | |
553 | + * @param {DOMNode} oNode the given DOM node | |
554 | + * @param {boolean} deep whether to recursively scan the children nodes of the given node for text as well. Default is <code>false</code> | |
555 | + * @memberOf Sarissa | |
556 | + */ | |
557 | +Sarissa.getText = function(oNode, deep){ | |
558 | + var s = ""; | |
559 | + var nodes = oNode.childNodes; | |
560 | + for(var i=0; i < nodes.length; i++){ | |
561 | + var node = nodes[i]; | |
562 | + var nodeType = node.nodeType; | |
563 | + if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){ | |
564 | + s += node.data; | |
565 | + } else if(deep === true && (nodeType == Node.ELEMENT_NODE || nodeType == Node.DOCUMENT_NODE || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){ | |
566 | + s += Sarissa.getText(node, true); | |
567 | + } | |
568 | + } | |
569 | + return s; | |
570 | +}; | |
571 | +if(!window.XMLSerializer && Sarissa.getDomDocument && Sarissa.getDomDocument("","foo", null).xml){ | |
572 | + /** | |
573 | + * Utility class to serialize DOM Node objects to XML strings | |
574 | + * @constructor | |
575 | + */ | |
576 | + XMLSerializer = function(){}; | |
577 | + /** | |
578 | + * Serialize the given DOM Node to an XML string | |
579 | + * @param {DOMNode} oNode the DOM Node to serialize | |
580 | + */ | |
581 | + XMLSerializer.prototype.serializeToString = function(oNode) { | |
582 | + return oNode.xml; | |
583 | + }; | |
584 | +} | |
585 | + | |
586 | +/** | |
587 | + * Strips tags from the given markup string. If the given string is | |
588 | + * <code>undefined</code>, <code>null</code> or empty, it is returned as is. | |
589 | + * @memberOf Sarissa | |
590 | + * @param {String} s the string to strip the tags from | |
591 | + */ | |
592 | +Sarissa.stripTags = function (s) { | |
593 | + return s?s.replace(/<[^>]+>/g,""):s; | |
594 | +}; | |
595 | +/** | |
596 | + * <p>Deletes all child nodes of the given node</p> | |
597 | + * @memberOf Sarissa | |
598 | + * @param {DOMNode} oNode the Node to empty | |
599 | + */ | |
600 | +Sarissa.clearChildNodes = function(oNode) { | |
601 | + // need to check for firstChild due to opera 8 bug with hasChildNodes | |
602 | + while(oNode.firstChild) { | |
603 | + oNode.removeChild(oNode.firstChild); | |
604 | + } | |
605 | +}; | |
606 | +/** | |
607 | + * <p> Copies the childNodes of nodeFrom to nodeTo</p> | |
608 | + * <p> <b>Note:</b> The second object's original content is deleted before | |
609 | + * the copy operation, unless you supply a true third parameter</p> | |
610 | + * @memberOf Sarissa | |
611 | + * @param {DOMNode} nodeFrom the Node to copy the childNodes from | |
612 | + * @param {DOMNode} nodeTo the Node to copy the childNodes to | |
613 | + * @param {boolean} bPreserveExisting whether to preserve the original content of nodeTo, default is false | |
614 | + */ | |
615 | +Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) { | |
616 | + if(Sarissa._SARISSA_IS_SAFARI && nodeTo.nodeType == Node.DOCUMENT_NODE){ // SAFARI_OLD ?? | |
617 | + nodeTo = nodeTo.documentElement; //Apparently there's a bug in safari where you can't appendChild to a document node | |
618 | + } | |
619 | + | |
620 | + if((!nodeFrom) || (!nodeTo)){ | |
621 | + throw "Both source and destination nodes must be provided"; | |
622 | + } | |
623 | + if(!bPreserveExisting){ | |
624 | + Sarissa.clearChildNodes(nodeTo); | |
625 | + } | |
626 | + var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument; | |
627 | + var nodes = nodeFrom.childNodes; | |
628 | + var i; | |
629 | + if(typeof(ownerDoc.importNode) != "undefined") { | |
630 | + for(i=0;i < nodes.length;i++) { | |
631 | + nodeTo.appendChild(ownerDoc.importNode(nodes[i], true)); | |
632 | + } | |
633 | + } else { | |
634 | + for(i=0;i < nodes.length;i++) { | |
635 | + nodeTo.appendChild(nodes[i].cloneNode(true)); | |
636 | + } | |
637 | + } | |
638 | +}; | |
639 | + | |
640 | +/** | |
641 | + * <p> Moves the childNodes of nodeFrom to nodeTo</p> | |
642 | + * <p> <b>Note:</b> The second object's original content is deleted before | |
643 | + * the move operation, unless you supply a true third parameter</p> | |
644 | + * @memberOf Sarissa | |
645 | + * @param {DOMNode} nodeFrom the Node to copy the childNodes from | |
646 | + * @param {DOMNode} nodeTo the Node to copy the childNodes to | |
647 | + * @param {boolean} bPreserveExisting whether to preserve the original content of nodeTo, default is | |
648 | + */ | |
649 | +Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) { | |
650 | + if((!nodeFrom) || (!nodeTo)){ | |
651 | + throw "Both source and destination nodes must be provided"; | |
652 | + } | |
653 | + if(!bPreserveExisting){ | |
654 | + Sarissa.clearChildNodes(nodeTo); | |
655 | + } | |
656 | + var nodes = nodeFrom.childNodes; | |
657 | + // if within the same doc, just move, else copy and delete | |
658 | + if(nodeFrom.ownerDocument == nodeTo.ownerDocument){ | |
659 | + while(nodeFrom.firstChild){ | |
660 | + nodeTo.appendChild(nodeFrom.firstChild); | |
661 | + } | |
662 | + } else { | |
663 | + var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument; | |
664 | + var i; | |
665 | + if(typeof(ownerDoc.importNode) != "undefined") { | |
666 | + for(i=0;i < nodes.length;i++) { | |
667 | + nodeTo.appendChild(ownerDoc.importNode(nodes[i], true)); | |
668 | + } | |
669 | + }else{ | |
670 | + for(i=0;i < nodes.length;i++) { | |
671 | + nodeTo.appendChild(nodes[i].cloneNode(true)); | |
672 | + } | |
673 | + } | |
674 | + Sarissa.clearChildNodes(nodeFrom); | |
675 | + } | |
676 | +}; | |
677 | + | |
678 | +/** | |
679 | + * <p>Serialize any <strong>non</strong> DOM object to an XML string. All properties are serialized using the property name | |
680 | + * as the XML element name. Array elements are rendered as <code>array-item</code> elements, | |
681 | + * using their index/key as the value of the <code>key</code> attribute.</p> | |
682 | + * @memberOf Sarissa | |
683 | + * @param {Object} anyObject the object to serialize | |
684 | + * @param {String} objectName a name for that object, to be used as the root element name | |
685 | + * @return {String} the XML serialization of the given object as a string | |
686 | + */ | |
687 | +Sarissa.xmlize = function(anyObject, objectName, indentSpace){ | |
688 | + indentSpace = indentSpace?indentSpace:''; | |
689 | + var s = indentSpace + '<' + objectName + '>'; | |
690 | + var isLeaf = false; | |
691 | + if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String || anyObject instanceof Boolean || anyObject instanceof Date){ | |
692 | + s += Sarissa.escape(""+anyObject); | |
693 | + isLeaf = true; | |
694 | + }else{ | |
695 | + s += "\n"; | |
696 | + var isArrayItem = anyObject instanceof Array; | |
697 | + for(var name in anyObject){ | |
698 | + s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\""+name+"\"":name), indentSpace + " "); | |
699 | + } | |
700 | + s += indentSpace; | |
701 | + } | |
702 | + return (s += (objectName.indexOf(' ')!=-1?"</array-item>\n":"</" + objectName + ">\n")); | |
703 | +}; | |
704 | + | |
705 | +/** | |
706 | + * Escape the given string chacters that correspond to the five predefined XML entities | |
707 | + * @memberOf Sarissa | |
708 | + * @param {String} sXml the string to escape | |
709 | + */ | |
710 | +Sarissa.escape = function(sXml){ | |
711 | + return sXml.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); | |
712 | +}; | |
713 | + | |
714 | +/** | |
715 | + * Unescape the given string. This turns the occurences of the predefined XML | |
716 | + * entities to become the characters they represent correspond to the five predefined XML entities | |
717 | + * @memberOf Sarissa | |
718 | + * @param {String}sXml the string to unescape | |
719 | + */ | |
720 | +Sarissa.unescape = function(sXml){ | |
721 | + return sXml.replace(/'/g,"'").replace(/"/g,"\"").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&"); | |
722 | +}; | |
723 | + | |
724 | +/** @private */ | |
725 | +Sarissa.updateCursor = function(oTargetElement, sValue) { | |
726 | + if(oTargetElement && oTargetElement.style && oTargetElement.style.cursor != undefined ){ | |
727 | + oTargetElement.style.cursor = sValue; | |
728 | + } | |
729 | +}; | |
730 | + | |
731 | +/** | |
732 | + * Asynchronously update an element with response of a GET request on the given URL. Passing a configured XSLT | |
733 | + * processor will result in transforming and updating oNode before using it to update oTargetElement. | |
734 | + * You can also pass a callback function to be executed when the update is finished. The function will be called as | |
735 | + * <code>functionName(oNode, oTargetElement);</code> | |
736 | + * @memberOf Sarissa | |
737 | + * @param {String} sFromUrl the URL to make the request to | |
738 | + * @param {DOMElement} oTargetElement the element to update | |
739 | + * @param {XSLTProcessor} xsltproc (optional) the transformer to use on the returned | |
740 | + * content before updating the target element with it | |
741 | + * @param {Function} callback (optional) a Function object to execute once the update is finished successfuly, called as <code>callback(sFromUrl, oTargetElement)</code>. | |
742 | + * In case an exception is thrown during execution, the callback is called as called as <code>callback(sFromUrl, oTargetElement, oException)</code> | |
743 | + * @param {boolean} skipCache (optional) whether to skip any cache | |
744 | + */ | |
745 | +Sarissa.updateContentFromURI = function(sFromUrl, oTargetElement, xsltproc, callback, skipCache) { | |
746 | + try{ | |
747 | + Sarissa.updateCursor(oTargetElement, "wait"); | |
748 | + var xmlhttp = new XMLHttpRequest(); | |
749 | + xmlhttp.open("GET", sFromUrl, true); | |
750 | + xmlhttp.onreadystatechange = function() { | |
751 | + if (xmlhttp.readyState == 4) { | |
752 | + try{ | |
753 | + var oDomDoc = xmlhttp.responseXML; | |
754 | + if(oDomDoc && Sarissa.getParseErrorText(oDomDoc) == Sarissa.PARSED_OK){ | |
755 | + Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement, xsltproc); | |
756 | + if(callback){ | |
757 | + callback(sFromUrl, oTargetElement); | |
758 | + } | |
759 | + } | |
760 | + else{ | |
761 | + throw Sarissa.getParseErrorText(oDomDoc); | |
762 | + } | |
763 | + } | |
764 | + catch(e){ | |
765 | + if(callback){ | |
766 | + callback(sFromUrl, oTargetElement, e); | |
767 | + } | |
768 | + else{ | |
769 | + throw e; | |
770 | + } | |
771 | + } | |
772 | + } | |
773 | + }; | |
774 | + if (skipCache) { | |
775 | + var oldage = "Sat, 1 Jan 2000 00:00:00 GMT"; | |
776 | + xmlhttp.setRequestHeader("If-Modified-Since", oldage); | |
777 | + } | |
778 | + xmlhttp.send(""); | |
779 | + } | |
780 | + catch(e){ | |
781 | + Sarissa.updateCursor(oTargetElement, "auto"); | |
782 | + if(callback){ | |
783 | + callback(sFromUrl, oTargetElement, e); | |
784 | + } | |
785 | + else{ | |
786 | + throw e; | |
787 | + } | |
788 | + } | |
789 | +}; | |
790 | + | |
791 | +/** | |
792 | + * Update an element's content with the given DOM node. Passing a configured XSLT | |
793 | + * processor will result in transforming and updating oNode before using it to update oTargetElement. | |
794 | + * You can also pass a callback function to be executed when the update is finished. The function will be called as | |
795 | + * <code>functionName(oNode, oTargetElement);</code> | |
796 | + * @memberOf Sarissa | |
797 | + * @param {DOMNode} oNode the URL to make the request to | |
798 | + * @param {DOMElement} oTargetElement the element to update | |
799 | + * @param {XSLTProcessor} xsltproc (optional) the transformer to use on the given | |
800 | + * DOM node before updating the target element with it | |
801 | + */ | |
802 | +Sarissa.updateContentFromNode = function(oNode, oTargetElement, xsltproc) { | |
803 | + try { | |
804 | + Sarissa.updateCursor(oTargetElement, "wait"); | |
805 | + Sarissa.clearChildNodes(oTargetElement); | |
806 | + // check for parsing errors | |
807 | + var ownerDoc = oNode.nodeType == Node.DOCUMENT_NODE?oNode:oNode.ownerDocument; | |
808 | + if(ownerDoc.parseError && ownerDoc.parseError.errorCode != 0) { | |
809 | + var pre = document.createElement("pre"); | |
810 | + pre.appendChild(document.createTextNode(Sarissa.getParseErrorText(ownerDoc))); | |
811 | + oTargetElement.appendChild(pre); | |
812 | + } | |
813 | + else { | |
814 | + // transform if appropriate | |
815 | + if(xsltproc) { | |
816 | + oNode = xsltproc.transformToDocument(oNode); | |
817 | + } | |
818 | + // be smart, maybe the user wants to display the source instead | |
819 | + if(oTargetElement.tagName.toLowerCase() == "textarea" || oTargetElement.tagName.toLowerCase() == "input") { | |
820 | + oTargetElement.value = new XMLSerializer().serializeToString(oNode); | |
821 | + } | |
822 | + else { | |
823 | + // ok that was not smart; it was paranoid. Keep up the good work by trying to use DOM instead of innerHTML | |
824 | + try{ | |
825 | + oTargetElement.appendChild(oTargetElement.ownerDocument.importNode(oNode, true)); | |
826 | + } | |
827 | + catch(e){ | |
828 | + oTargetElement.innerHTML = new XMLSerializer().serializeToString(oNode); | |
829 | + } | |
830 | + } | |
831 | + } | |
832 | + } | |
833 | + catch(e) { | |
834 | + throw e; | |
835 | + } | |
836 | + finally{ | |
837 | + Sarissa.updateCursor(oTargetElement, "auto"); | |
838 | + } | |
839 | +}; | |
840 | + | |
841 | + | |
842 | +/** | |
843 | + * Creates an HTTP URL query string from the given HTML form data | |
844 | + * @memberOf Sarissa | |
845 | + * @param {HTMLFormElement} oForm the form to construct the query string from | |
846 | + */ | |
847 | +Sarissa.formToQueryString = function(oForm){ | |
848 | + var qs = ""; | |
849 | + for(var i = 0;i < oForm.elements.length;i++) { | |
850 | + var oField = oForm.elements[i]; | |
851 | + var sFieldName = oField.getAttribute("name") ? oField.getAttribute("name") : oField.getAttribute("id"); | |
852 | + // ensure we got a proper name/id and that the field is not disabled | |
853 | + if(sFieldName && | |
854 | + ((!oField.disabled) || oField.type == "hidden")) { | |
855 | + switch(oField.type) { | |
856 | + case "hidden": | |
857 | + case "text": | |
858 | + case "textarea": | |
859 | + case "password": | |
860 | + qs += sFieldName + "=" + encodeURIComponent(oField.value) + "&"; | |
861 | + break; | |
862 | + case "select-one": | |
863 | + qs += sFieldName + "=" + encodeURIComponent(oField.options[oField.selectedIndex].value) + "&"; | |
864 | + break; | |
865 | + case "select-multiple": | |
866 | + for (var j = 0; j < oField.length; j++) { | |
867 | + var optElem = oField.options[j]; | |
868 | + if (optElem.selected === true) { | |
869 | + qs += sFieldName + "[]" + "=" + encodeURIComponent(optElem.value) + "&"; | |
870 | + } | |
871 | + } | |
872 | + break; | |
873 | + case "checkbox": | |
874 | + case "radio": | |
875 | + if(oField.checked) { | |
876 | + qs += sFieldName + "=" + encodeURIComponent(oField.value) + "&"; | |
877 | + } | |
878 | + break; | |
879 | + } | |
880 | + } | |
881 | + } | |
882 | + // return after removing last '&' | |
883 | + return qs.substr(0, qs.length - 1); | |
884 | +}; | |
885 | + | |
886 | + | |
887 | +/** | |
888 | + * Asynchronously update an element with response of an XMLHttpRequest-based emulation of a form submission. <p>The form <code>action</code> and | |
889 | + * <code>method</code> attributess will be followed. Passing a configured XSLT processor will result in | |
890 | + * transforming and updating the server response before using it to update the target element. | |
891 | + * You can also pass a callback function to be executed when the update is finished. The function will be called as | |
892 | + * <code>functionName(oNode, oTargetElement);</code></p> | |
893 | + * <p>Here is an example of using this in a form element:</p> | |
894 | + * <pre name="code" class="xml"> | |
895 | + * <div id="targetId"> this content will be updated</div> | |
896 | + * <form action="/my/form/handler" method="post" | |
897 | + * onbeforesubmit="return Sarissa.updateContentFromForm(this, document.getElementById('targetId'));"><pre> | |
898 | + * <p>If JavaScript is supported, the form will not be submitted. Instead, Sarissa will | |
899 | + * scan the form and make an appropriate AJAX request, also adding a parameter | |
900 | + * to signal to the server that this is an AJAX call. The parameter is | |
901 | + * constructed as <code>Sarissa.REMOTE_CALL_FLAG = "=true"</code> so you can change the name in your webpage | |
902 | + * simply by assigning another value to Sarissa.REMOTE_CALL_FLAG. If JavaScript is not supported | |
903 | + * the form will be submitted normally. | |
904 | + * @memberOf Sarissa | |
905 | + * @param {HTMLFormElement} oForm the form submition to emulate | |
906 | + * @param {DOMElement} oTargetElement the element to update | |
907 | + * @param {XSLTProcessor} xsltproc (optional) the transformer to use on the returned | |
908 | + * content before updating the target element with it | |
909 | + * @param {Function} callback (optional) a Function object to execute once the update is finished successfuly, called as <code>callback(oNode, oTargetElement)</code>. | |
910 | + * In case an exception occurs during excecution and a callback function was provided, the exception is cought and the callback is called as | |
911 | + * <code>callback(oForm, oTargetElement, exception)</code> | |
912 | + */ | |
913 | +Sarissa.updateContentFromForm = function(oForm, oTargetElement, xsltproc, callback) { | |
914 | + try{ | |
915 | + Sarissa.updateCursor(oTargetElement, "wait"); | |
916 | + // build parameters from form fields | |
917 | + var params = Sarissa.formToQueryString(oForm) + "&" + Sarissa.REMOTE_CALL_FLAG + "=true"; | |
918 | + var xmlhttp = new XMLHttpRequest(); | |
919 | + var bUseGet = oForm.getAttribute("method") && oForm.getAttribute("method").toLowerCase() == "get"; | |
920 | + if(bUseGet) { | |
921 | + xmlhttp.open("GET", oForm.getAttribute("action")+"?"+params, true); | |
922 | + } | |
923 | + else{ | |
924 | + xmlhttp.open('POST', oForm.getAttribute("action"), true); | |
925 | + xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); | |
926 | + xmlhttp.setRequestHeader("Content-length", params.length); | |
927 | + xmlhttp.setRequestHeader("Connection", "close"); | |
928 | + } | |
929 | + xmlhttp.onreadystatechange = function() { | |
930 | + try{ | |
931 | + if (xmlhttp.readyState == 4) { | |
932 | + var oDomDoc = xmlhttp.responseXML; | |
933 | + if(oDomDoc && Sarissa.getParseErrorText(oDomDoc) == Sarissa.PARSED_OK){ | |
934 | + Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement, xsltproc); | |
935 | + if(callback){ | |
936 | + callback(oForm, oTargetElement); | |
937 | + } | |
938 | + } | |
939 | + else{ | |
940 | + throw Sarissa.getParseErrorText(oDomDoc); | |
941 | + } | |
942 | + } | |
943 | + } | |
944 | + catch(e){ | |
945 | + if(callback){ | |
946 | + callback(oForm, oTargetElement, e); | |
947 | + } | |
948 | + else{ | |
949 | + throw e; | |
950 | + } | |
951 | + } | |
952 | + }; | |
953 | + xmlhttp.send(bUseGet?"":params); | |
954 | + } | |
955 | + catch(e){ | |
956 | + Sarissa.updateCursor(oTargetElement, "auto"); | |
957 | + if(callback){ | |
958 | + callback(oForm, oTargetElement, e); | |
959 | + } | |
960 | + else{ | |
961 | + throw e; | |
962 | + } | |
963 | + } | |
964 | + return false; | |
965 | +}; | |
966 | +Sarissa.FUNCTION_NAME_REGEXP = new RegExp("");//new RegExp("function\\s+(\\S+)\\s*\\((.|\\n)*?\\)\\s*{"); | |
967 | +/** | |
968 | + * Get the name of a function created like: | |
969 | + * <pre>function functionName(){}</pre> | |
970 | + * If a name is not found and the bForce parameter is true, | |
971 | + * attach the function to the window object with a new name and | |
972 | + * return that | |
973 | + * @param {Function} oFunc the function object | |
974 | + * @param {boolean} bForce whether to force a name under the window context if none is found | |
975 | + */ | |
976 | +Sarissa.getFunctionName = function(oFunc, bForce){ | |
977 | + //alert("Sarissa.getFunctionName oFunc: "+oFunc); | |
978 | + var name; | |
979 | + if(!name){ | |
980 | + if(bForce){ | |
981 | + // attach to window object under a new name | |
982 | + name = "SarissaAnonymous" + Sarissa._getUniqueSuffix(); | |
983 | + window[name] = oFunc; | |
984 | + } | |
985 | + else{ | |
986 | + name = null; | |
987 | + } | |
988 | + } | |
989 | + | |
990 | + //alert("Sarissa.getFunctionName returns: "+name); | |
991 | + if(name){ | |
992 | + window[name] = oFunc; | |
993 | + } | |
994 | + return name; | |
995 | +}; | |
996 | + | |
997 | +/** | |
998 | + * | |
999 | + */ | |
1000 | +Sarissa.setRemoteJsonCallback = function(url, callback, callbackParam) { | |
1001 | + if(!callbackParam){ | |
1002 | + callbackParam = "callback"; | |
1003 | + } | |
1004 | + var callbackFunctionName = Sarissa.getFunctionName(callback, true); | |
1005 | + var id = "sarissa_json_script_id_" + Sarissa._getUniqueSuffix(); | |
1006 | + var oHead = document.getElementsByTagName("head")[0]; | |
1007 | + var scriptTag = document.createElement('script'); | |
1008 | + scriptTag.type = 'text/javascript'; | |
1009 | + scriptTag.id = id; | |
1010 | + scriptTag.onload = function(){ | |
1011 | + // cleanUp | |
1012 | + // document.removeChild(scriptTag); | |
1013 | + }; | |
1014 | + if(url.indexOf("?") != -1){ | |
1015 | + url += ("&" + callbackParam + "=" + callbackFunctionName); | |
1016 | + } | |
1017 | + else{ | |
1018 | + url += ("?" + callbackParam + "=" + callbackFunctionName); | |
1019 | + } | |
1020 | + scriptTag.src = url; | |
1021 | + oHead.appendChild(scriptTag); | |
1022 | + return id; | |
1023 | +}; | |
1024 | + | |
1025 | +// EOF | ... | ... |
... | ... | @@ -0,0 +1,220 @@ |
1 | +/** | |
2 | + * ==================================================================== | |
3 | + * About | |
4 | + * ==================================================================== | |
5 | + * Sarissa cross browser XML library - IE XPath Emulation | |
6 | + * @version 0.9.9.4 | |
7 | + * @author: Copyright 2004-2007 Emmanouil Batsis, mailto: mbatsis at users full stop sourceforge full stop net | |
8 | + * | |
9 | + * This script emulates Internet Explorer's selectNodes and selectSingleNode | |
10 | + * for Mozilla. Associating namespace prefixes with URIs for your XPath queries | |
11 | + * is easy with IE's setProperty. | |
12 | + * USers may also map a namespace prefix to a default (unprefixed) namespace in the | |
13 | + * source document with Sarissa.setXpathNamespaces | |
14 | + * | |
15 | + * ==================================================================== | |
16 | + * Licence | |
17 | + * ==================================================================== | |
18 | + * Sarissa is free software distributed under the GNU GPL version 2 (see <a href="gpl.txt">gpl.txt</a>) or higher, | |
19 | + * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or higher and Apache Software License 2.0 or higher | |
20 | + * (see <a href="asl.txt">asl.txt</a>). This means you can choose one of the three and use that if you like. If | |
21 | + * you make modifications under the ASL, i would appreciate it if you submitted those. | |
22 | + * In case your copy of Sarissa does not include the license texts, you may find | |
23 | + * them online in various formats at <a href="http://www.gnu.org">http://www.gnu.org</a> and | |
24 | + * <a href="http://www.apache.org">http://www.apache.org</a>. | |
25 | + * | |
26 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY | |
27 | + * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE | |
28 | + * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE | |
29 | + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
30 | + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
31 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
32 | + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |
33 | + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
34 | + */ | |
35 | +if(Sarissa._SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){ | |
36 | + /** | |
37 | + * <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>, | |
38 | + * so it also has some properties IEs proprietery object features.</p> | |
39 | + * @private | |
40 | + * @constructor | |
41 | + * @argument i the (initial) list size | |
42 | + */ | |
43 | + SarissaNodeList = function (i){ | |
44 | + this.length = i; | |
45 | + }; | |
46 | + /** | |
47 | + * <p>Set an Array as the prototype object</p> | |
48 | + * @private | |
49 | + */ | |
50 | + SarissaNodeList.prototype = []; | |
51 | + /** | |
52 | + * <p>Inherit the Array constructor </p> | |
53 | + * @private | |
54 | + */ | |
55 | + SarissaNodeList.prototype.constructor = Array; | |
56 | + /** | |
57 | + * <p>Returns the node at the specified index or null if the given index | |
58 | + * is greater than the list size or less than zero </p> | |
59 | + * <p><b>Note</b> that in ECMAScript you can also use the square-bracket | |
60 | + * array notation instead of calling <code>item</code> | |
61 | + * @argument i the index of the member to return | |
62 | + * @returns the member corresponding to the given index | |
63 | + * @private | |
64 | + */ | |
65 | + SarissaNodeList.prototype.item = function(i) { | |
66 | + return (i < 0 || i >= this.length)?null:this[i]; | |
67 | + }; | |
68 | + /** | |
69 | + * <p>Emulate IE's expr property | |
70 | + * (Here the SarissaNodeList object is given as the result of selectNodes).</p> | |
71 | + * @returns the XPath expression passed to selectNodes that resulted in | |
72 | + * this SarissaNodeList | |
73 | + * @private | |
74 | + */ | |
75 | + SarissaNodeList.prototype.expr = ""; | |
76 | + /** dummy, used to accept IE's stuff without throwing errors */ | |
77 | + if(window.XMLDocument && (!XMLDocument.prototype.setProperty)){ | |
78 | + XMLDocument.prototype.setProperty = function(x,y){}; | |
79 | + } | |
80 | + /** | |
81 | + * <p>Programmatically control namespace URI/prefix mappings for XPath | |
82 | + * queries.</p> | |
83 | + * <p>This method comes especially handy when used to apply XPath queries | |
84 | + * on XML documents with a default namespace, as there is no other way | |
85 | + * of mapping that to a prefix.</p> | |
86 | + * <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you | |
87 | + * are looking for elements in the null namespace. If you need to look | |
88 | + * for nodes in the default namespace, you need to map a prefix to it | |
89 | + * first like:</p> | |
90 | + * <pre>Sarissa.setXpathNamespaces(oDoc, "xmlns:myprefix'http://mynsURI'");</pre> | |
91 | + * <p><b>Note 1 </b>: Use this method only if the source document features | |
92 | + * a default namespace (without a prefix), otherwise just use IE's setProperty | |
93 | + * (moz will rezolve non-default namespaces by itself). You will need to map that | |
94 | + * namespace to a prefix for queries to work.</p> | |
95 | + * <p><b>Note 2 </b>: This method calls IE's setProperty method to set the | |
96 | + * appropriate namespace-prefix mappings, so you dont have to do that.</p> | |
97 | + * @param oDoc The target XMLDocument to set the namespace mappings for. | |
98 | + * @param sNsSet A whilespace-seperated list of namespace declarations as | |
99 | + * those would appear in an XML document. E.g.: | |
100 | + * <code>"xmlns:xhtml='http://www.w3.org/1999/xhtml' | |
101 | + * xmlns:'http://www.w3.org/1999/XSL/Transform'"</code> | |
102 | + * @throws An error if the format of the given namespace declarations is bad. | |
103 | + */ | |
104 | + Sarissa.setXpathNamespaces = function(oDoc, sNsSet) { | |
105 | + //oDoc._sarissa_setXpathNamespaces(sNsSet); | |
106 | + oDoc._sarissa_useCustomResolver = true; | |
107 | + var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):[sNsSet]; | |
108 | + oDoc._sarissa_xpathNamespaces = []; | |
109 | + for(var i=0;i < namespaces.length;i++){ | |
110 | + var ns = namespaces[i]; | |
111 | + var colonPos = ns.indexOf(":"); | |
112 | + var assignPos = ns.indexOf("="); | |
113 | + if(colonPos > 0 && assignPos > colonPos+1){ | |
114 | + var prefix = ns.substring(colonPos+1, assignPos); | |
115 | + var uri = ns.substring(assignPos+2, ns.length-1); | |
116 | + oDoc._sarissa_xpathNamespaces[prefix] = uri; | |
117 | + }else{ | |
118 | + throw "Bad format on namespace declaration(s) given"; | |
119 | + } | |
120 | + } | |
121 | + }; | |
122 | + /** | |
123 | + * @private Flag to control whether a custom namespace resolver should | |
124 | + * be used, set to true by Sarissa.setXpathNamespaces | |
125 | + */ | |
126 | + XMLDocument.prototype._sarissa_useCustomResolver = false; | |
127 | + /** @private */ | |
128 | + XMLDocument.prototype._sarissa_xpathNamespaces = []; | |
129 | + /** | |
130 | + * <p>Extends the XMLDocument to emulate IE's selectNodes.</p> | |
131 | + * @argument sExpr the XPath expression to use | |
132 | + * @argument contextNode this is for internal use only by the same | |
133 | + * method when called on Elements | |
134 | + * @returns the result of the XPath search as a SarissaNodeList | |
135 | + * @throws An error if no namespace URI is found for the given prefix. | |
136 | + */ | |
137 | + XMLDocument.prototype.selectNodes = function(sExpr, contextNode, returnSingle){ | |
138 | + var nsDoc = this; | |
139 | + var nsresolver; | |
140 | + if(this._sarissa_useCustomResolver){ | |
141 | + nsresolver = function(prefix){ | |
142 | + var s = nsDoc._sarissa_xpathNamespaces[prefix]; | |
143 | + if(s){ | |
144 | + return s; | |
145 | + } | |
146 | + else { | |
147 | + throw "No namespace URI found for prefix: '" + prefix+"'"; | |
148 | + } | |
149 | + }; | |
150 | + } | |
151 | + else{ | |
152 | + nsresolver = this.createNSResolver(this.documentElement); | |
153 | + } | |
154 | + var result = null; | |
155 | + if(!returnSingle){ | |
156 | + var oResult = this.evaluate(sExpr, | |
157 | + (contextNode?contextNode:this), | |
158 | + nsresolver, | |
159 | + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); | |
160 | + var nodeList = new SarissaNodeList(oResult.snapshotLength); | |
161 | + nodeList.expr = sExpr; | |
162 | + for(var i=0;i<nodeList.length;i++){ | |
163 | + nodeList[i] = oResult.snapshotItem(i); | |
164 | + } | |
165 | + result = nodeList; | |
166 | + } | |
167 | + else { | |
168 | + result = this.evaluate(sExpr, | |
169 | + (contextNode?contextNode:this), | |
170 | + nsresolver, | |
171 | + XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; | |
172 | + } | |
173 | + return result; | |
174 | + }; | |
175 | + /** | |
176 | + * <p>Extends the Element to emulate IE's selectNodes</p> | |
177 | + * @argument sExpr the XPath expression to use | |
178 | + * @returns the result of the XPath search as an (Sarissa)NodeList | |
179 | + * @throws An | |
180 | + * error if invoked on an HTML Element as this is only be | |
181 | + * available to XML Elements. | |
182 | + */ | |
183 | + Element.prototype.selectNodes = function(sExpr){ | |
184 | + var doc = this.ownerDocument; | |
185 | + if(doc.selectNodes){ | |
186 | + return doc.selectNodes(sExpr, this); | |
187 | + } | |
188 | + else{ | |
189 | + throw "Method selectNodes is only supported by XML Elements"; | |
190 | + } | |
191 | + }; | |
192 | + /** | |
193 | + * <p>Extends the XMLDocument to emulate IE's selectSingleNode.</p> | |
194 | + * @argument sExpr the XPath expression to use | |
195 | + * @argument contextNode this is for internal use only by the same | |
196 | + * method when called on Elements | |
197 | + * @returns the result of the XPath search as an (Sarissa)NodeList | |
198 | + */ | |
199 | + XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){ | |
200 | + var ctx = contextNode?contextNode:null; | |
201 | + return this.selectNodes(sExpr, ctx, true); | |
202 | + }; | |
203 | + /** | |
204 | + * <p>Extends the Element to emulate IE's selectSingleNode.</p> | |
205 | + * @argument sExpr the XPath expression to use | |
206 | + * @returns the result of the XPath search as an (Sarissa)NodeList | |
207 | + * @throws An error if invoked on an HTML Element as this is only be | |
208 | + * available to XML Elements. | |
209 | + */ | |
210 | + Element.prototype.selectSingleNode = function(sExpr){ | |
211 | + var doc = this.ownerDocument; | |
212 | + if(doc.selectSingleNode){ | |
213 | + return doc.selectSingleNode(sExpr, this); | |
214 | + } | |
215 | + else{ | |
216 | + throw "Method selectNodes is only supported by XML Elements"; | |
217 | + } | |
218 | + }; | |
219 | + Sarissa.IS_ENABLED_SELECT_NODES = true; | |
220 | +} | |
0 | 221 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,8 @@ |
1 | +<select name="cswhosts"> | |
2 | + <option value="http://geomatics.nlr.nl/excat/csw">eXcat@nlr</option> | |
3 | + <option value="http://dinolks03.nitg.tno.nl/excat/csw">eXcat@tno</option> | |
4 | + <option value="http://www.geodata.alterra.nl/excat/csw">eXcat@alterra</option> | |
5 | + <option value="http://geonovum.nitg.tno.nl:8080/geonetwork/srv/en/csw">Geonovum</option> | |
6 | + <option value="http://www.metadados.inde.gov.br/geonetwork/srv/br/csw">INDE-BR</option> | |
7 | + <option value="http://mapas.mma.gov.br/geonetwork/srv/br/csw">INDE-MMA</option> | |
8 | +</select> | ... | ... |
... | ... | @@ -0,0 +1,65 @@ |
1 | +<div id="cswclient" class="clearfix" style="padding: 0 1em 4px 1em"> | |
2 | + | |
3 | + <div id="query-container"> | |
4 | + <div class="csw-main"> | |
5 | + <div class="csw-content"> | |
6 | + <div class="captioneddiv"> | |
7 | + <h3>Simple CSW Client</h3> | |
8 | + <form name="theForm" method="POST" action="javascript:void(csw_client.getRecords())"> | |
9 | + <select name="queryable"> | |
10 | + <option value="anytext">AnyText</option> | |
11 | + <option value="title">Title</option> | |
12 | + <option value="subject">Subject</option> | |
13 | + </select> | |
14 | + <select name="operator"> | |
15 | + <option value="contains">contains</option> | |
16 | + <option value="equals">equals</option> | |
17 | + </select> | |
18 | + <input type="text" name="query" value="" size="24"/> | |
19 | + <p/> | |
20 | + <span id="csw-hosts"></span> | |
21 | + <select id="schema" name="schema"> | |
22 | + <option value="http://www.opengis.net/cat/csw/2.0.2">csw:Record</option> | |
23 | + <option value="http://www.isotc211.org/2005/gmd">ISO19139</option> | |
24 | + </select> | |
25 | + <select id="dislaymode" name="displaymode"> | |
26 | + <option value="html">HTML</option> | |
27 | + <option value="xml">XML</option> | |
28 | + </select> | |
29 | + <select id="sortby" name="sortby"> | |
30 | + <option value="none">No Sort</option> | |
31 | + <option value="title">Title</option> | |
32 | + </select> | |
33 | + <p/> | |
34 | + <!--input type="hidden" name="schema" value="http://www.opengis.net/cat/csw/2.0.2"/--> | |
35 | + <!--input type="hidden" name="schema" value="http://www.isotc211.org/2005/gmd"/--> | |
36 | + <!--input type="hidden" name="displaymode" value="html"/--> | |
37 | + <input type="button" value="clear" onClick="javascript:void(csw_client.clearPage())"/> | |
38 | + <input type="button" value="submit" onClick="javascript:void(csw_client.getRecords())"/> | |
39 | + </form> | |
40 | + </div> | |
41 | + | |
42 | + <div id="results-container"> | |
43 | + <div class="csw-main2" id="results"> | |
44 | + <div class="csw-contents"> | |
45 | + <div id="csw-output"></div> | |
46 | + </div> | |
47 | + </div> | |
48 | + </div> | |
49 | + | |
50 | + </div> | |
51 | + </div><!-- main --> | |
52 | + </div><!-- query-container --> | |
53 | + <p/> | |
54 | + <div id="popup"> | |
55 | + <div class="close"> | |
56 | + <a href="javascript:void(csw_client.hideDiv(document.getElementById('popup')))">[close]</a> | |
57 | + </div> | |
58 | + <div id="popup2"> | |
59 | + <div class="csw-content2"> | |
60 | + <div id="metadata"></div> | |
61 | + </div> | |
62 | + </div> | |
63 | + </div><!-- popup --> | |
64 | + <div id="overlay" style="visibility:hidden"></div> | |
65 | + </div><!-- cswclient --> | ... | ... |
... | ... | @@ -0,0 +1,14 @@ |
1 | +<defaults> | |
2 | +<version>2.0.2</version> | |
3 | +<maxrecords>10</maxrecords> | |
4 | +<startposition>1</startposition> | |
5 | +<outputformat>application/xml</outputformat> | |
6 | +<outputschema>http://www.opengis.net/cat/csw/2.0.2</outputschema> | |
7 | +<!--outputschema>http://www.isotc211.org/2005/gmd</outputschema--> | |
8 | +<resulttype>results</resulttype> | |
9 | +<propertyname>AnyText</propertyname> | |
10 | +<literal></literal> | |
11 | +<sortby></sortby> | |
12 | +<sortorder>ASC</sortorder> | |
13 | +<id></id> | |
14 | +</defaults> | ... | ... |
... | ... | @@ -0,0 +1,448 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" | |
3 | + xmlns:gco="http://www.isotc211.org/2005/gco" | |
4 | + xmlns:gmd="http://www.isotc211.org/2005/gmd" | |
5 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | |
6 | + xmlns:dct="http://purl.org/dc/terms/" | |
7 | + xmlns:ows="http://www.opengis.net/ows" | |
8 | + xmlns:cat="http://www.esri.com/metadata/csw/"> | |
9 | + | |
10 | +<xsl:output method="xml" encoding="ISO-8859-1"/> | |
11 | + | |
12 | + | |
13 | +<xsl:template match="/"> | |
14 | + <div> | |
15 | + <xsl:apply-templates/> | |
16 | + </div> | |
17 | +</xsl:template> | |
18 | + | |
19 | +<xsl:template match="/*[local-name()='GetRecordByIdResponse']"> | |
20 | + <xsl:apply-templates select="cat:FullRecord"/> | |
21 | + <xsl:apply-templates select="*[local-name()='Record']"/> | |
22 | + <xsl:apply-templates select="*[local-name()='SummaryRecord']"/> | |
23 | + <xsl:apply-templates select="*[local-name()='BriefRecord']"/> | |
24 | + <xsl:apply-templates select="gmd:MD_Metadata"/> | |
25 | + <xsl:apply-templates select="Metadata"/> | |
26 | + <xsl:apply-templates select="metadata"/> | |
27 | +</xsl:template> | |
28 | + | |
29 | +<xsl:template match="cat:FullRecord"> | |
30 | + <xsl:apply-templates select="metadata"/> | |
31 | +</xsl:template> | |
32 | + | |
33 | + | |
34 | +<!-- Start Metadata ISO19139 --> | |
35 | +<xsl:template match="gmd:MD_Metadata"> | |
36 | + <!-- First the Identification block --> | |
37 | + <xsl:apply-templates select="./gmd:identificationInfo/gmd:MD_DataIdentification"/> | |
38 | + <xsl:apply-templates select="./gmd:distributionInfo/gmd:MD_Distribution"/> | |
39 | + | |
40 | +<!-- Metadata block --> | |
41 | +<div class="captioneddiv"> | |
42 | +<h3>Metadata</h3> | |
43 | +<table class="meta"><tr></tr> | |
44 | + <xsl:call-template name="tablerow"> | |
45 | + <xsl:with-param name="cname" select="'File Identifier'"/> | |
46 | + <xsl:with-param name="cvalue" select="./gmd:fileIdentifier/gco:CharacterString"/> | |
47 | + </xsl:call-template> | |
48 | + <xsl:call-template name="tablerow"> | |
49 | + <xsl:with-param name="cname" select="'Language'"/> | |
50 | + <xsl:with-param name="cvalue" select="./gmd:language/gco:CharacterString"/> | |
51 | + </xsl:call-template> | |
52 | + <xsl:call-template name="tablerow"> | |
53 | + <xsl:with-param name="cname" select="'Character set'"/> | |
54 | + <xsl:with-param name="cvalue" select="./gmd:characterSet/gmd:MD_CharacterSetCode/@codeListValue"/> | |
55 | + </xsl:call-template> | |
56 | + <xsl:call-template name="tablerow"> | |
57 | + <xsl:with-param name="cname" select="'Date stamp'"/> | |
58 | + <xsl:with-param name="cvalue" select="./gmd:dateStamp/gco:Date"/> | |
59 | + </xsl:call-template> | |
60 | + <xsl:call-template name="tablerow"> | |
61 | + <xsl:with-param name="cname" select="'Metadata standard name'"/> | |
62 | + <xsl:with-param name="cvalue" select="./gmd:metadataStandardName/gco:CharacterString"/> | |
63 | + </xsl:call-template> | |
64 | + <xsl:call-template name="tablerow"> | |
65 | + <xsl:with-param name="cname" select="'Metadata standard version'"/> | |
66 | + <xsl:with-param name="cvalue" select="./gmd:metadataStandardVersion/gco:CharacterString"/> | |
67 | + </xsl:call-template> | |
68 | +</table> | |
69 | + <xsl:apply-templates select="./gmd:contact"/> | |
70 | +</div> | |
71 | +</xsl:template> | |
72 | + | |
73 | +<!-- 'Metadata->Metadata author' block --> | |
74 | +<xsl:template match="gmd:contact"> | |
75 | +<div class="captioneddiv"> | |
76 | +<h3>Metadata author</h3> | |
77 | +<table class="meta"> | |
78 | +<tr> | |
79 | +<td class="meta" valign="top"> | |
80 | +<table class="meta"><tr></tr> | |
81 | + <xsl:call-template name="tablerow"> | |
82 | + <xsl:with-param name="cname" select="'Individual name'"/> | |
83 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:individualName/gco:CharacterString"/> | |
84 | + </xsl:call-template> | |
85 | + <xsl:call-template name="tablerow"> | |
86 | + <xsl:with-param name="cname" select="'Organisation name'"/> | |
87 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString"/> | |
88 | + </xsl:call-template> | |
89 | + <xsl:call-template name="tablerow"> | |
90 | + <xsl:with-param name="cname" select="'Position'"/> | |
91 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:positionName/gco:CharacterString"/> | |
92 | + </xsl:call-template> | |
93 | + <xsl:call-template name="tablerow"> | |
94 | + <xsl:with-param name="cname" select="'Role'"/> | |
95 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:role/gmd:CI_RoleCode/@codeListValue"/> | |
96 | + </xsl:call-template> | |
97 | +</table></td> | |
98 | +<td class="meta" valign="top"> | |
99 | +<table class="meta"><tr></tr> | |
100 | + <xsl:call-template name="tablerow"> | |
101 | + <xsl:with-param name="cname" select="'Voice'"/> | |
102 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:phone/gmd:CI_Telephone/gmd:voice/gco:CharacterString"/> | |
103 | + </xsl:call-template> | |
104 | + <xsl:call-template name="tablerow"> | |
105 | + <xsl:with-param name="cname" select="'Facsimile'"/> | |
106 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:phone/gmd:CI_Telephone/gmd:facsimile/gco:CharacterString"/> | |
107 | + </xsl:call-template> | |
108 | + <xsl:call-template name="tablerow"> | |
109 | + <xsl:with-param name="cname" select="'Delivery Point'"/> | |
110 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:deliveryPoint/gco:CharacterString"/> | |
111 | + </xsl:call-template> | |
112 | + <xsl:call-template name="tablerow"> | |
113 | + <xsl:with-param name="cname" select="'City'"/> | |
114 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:city/gco:CharacterString"/> | |
115 | + </xsl:call-template> | |
116 | + <xsl:call-template name="tablerow"> | |
117 | + <xsl:with-param name="cname" select="'Postal code'"/> | |
118 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:postalCode/gco:CharacterString"/> | |
119 | + </xsl:call-template> | |
120 | + <xsl:call-template name="tablerow"> | |
121 | + <xsl:with-param name="cname" select="'Country'"/> | |
122 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:country/gco:CharacterString"/> | |
123 | + </xsl:call-template> | |
124 | + <xsl:call-template name="tablerow"> | |
125 | + <xsl:with-param name="cname" select="'Email'"/> | |
126 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:electronicMailAddress/gco:CharacterString"/> | |
127 | + </xsl:call-template> | |
128 | +</table></td> | |
129 | +</tr> | |
130 | +</table> | |
131 | +</div> | |
132 | +</xsl:template> | |
133 | + | |
134 | +<!-- 'Identification' block --> | |
135 | +<xsl:template match="gmd:MD_DataIdentification"> | |
136 | +<div class="captioneddiv"> | |
137 | +<h3>Identification info</h3> | |
138 | +<table class="meta"><tr></tr> | |
139 | + <xsl:call-template name="tablerow"> | |
140 | + <xsl:with-param name="cname" select="'Title'"/> | |
141 | + <xsl:with-param name="cvalue" select="./gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString"/> | |
142 | + </xsl:call-template> | |
143 | + <xsl:call-template name="tablerow"> | |
144 | + <xsl:with-param name="cname" select="'Date'"/> | |
145 | + <xsl:with-param name="cvalue" select="./gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:data/gco:Date"/> | |
146 | + </xsl:call-template> | |
147 | + <!--xsl:call-template name="tablerow"> | |
148 | + <xsl:with-param name="cname" select="'Presentation form'"/> | |
149 | + <xsl:with-param name="cvalue" select="./idCitation/presForm/PresFormCd/@value"/> | |
150 | + </xsl:call-template--> | |
151 | + <xsl:call-template name="tablerow"> | |
152 | + <xsl:with-param name="cname" select="'Individual name'"/> | |
153 | + <xsl:with-param name="cvalue" select="./gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:individualName/gco:CharacterString"/> | |
154 | + </xsl:call-template> | |
155 | + <xsl:call-template name="tablerow"> | |
156 | + <xsl:with-param name="cname" select="'Organisation name'"/> | |
157 | + <xsl:with-param name="cvalue" select="./gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString"/> | |
158 | + </xsl:call-template> | |
159 | + | |
160 | + <!--abstract is handled seperately because of text formatting--> | |
161 | + <tr> | |
162 | + <td class="meta-param">Abstract:</td> | |
163 | + <td class="meta-value"> | |
164 | + <xsl:apply-templates select="./gmd:abstract"/> | |
165 | + </td> | |
166 | + </tr> | |
167 | +</table> | |
168 | + <xsl:apply-templates select="./gmd:extent"/> | |
169 | + <xsl:apply-templates select="./gmd:pointOfContact"/> | |
170 | +</div> | |
171 | +</xsl:template> | |
172 | + | |
173 | +<!-- 'Identification->Point of Contact' block --> | |
174 | +<xsl:template match="gmd:pointOfContact"> | |
175 | +<div class="captioneddiv"> | |
176 | +<h3>Point of Contact</h3> | |
177 | +<table class="meta"> | |
178 | +<tr> | |
179 | +<td class="meta" valign="top"> | |
180 | +<table class="meta"><tr></tr> | |
181 | + <xsl:call-template name="tablerow"> | |
182 | + <xsl:with-param name="cname" select="'Individual name'"/> | |
183 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:individualName/gco:CharacterString"/> | |
184 | + </xsl:call-template> | |
185 | + <xsl:call-template name="tablerow"> | |
186 | + <xsl:with-param name="cname" select="'Organisation name'"/> | |
187 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString"/> | |
188 | + </xsl:call-template> | |
189 | + <xsl:call-template name="tablerow"> | |
190 | + <xsl:with-param name="cname" select="'Position'"/> | |
191 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:positionName/gco:CharacterString"/> | |
192 | + </xsl:call-template> | |
193 | + <xsl:call-template name="tablerow"> | |
194 | + <xsl:with-param name="cname" select="'Role'"/> | |
195 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:role/gmd:CI_RoleCode/@codeListValue"/> | |
196 | + </xsl:call-template> | |
197 | +</table></td> | |
198 | +<td class="meta" valign="top"> | |
199 | +<table class="meta"><tr></tr> | |
200 | + <xsl:call-template name="tablerow"> | |
201 | + <xsl:with-param name="cname" select="'Voice'"/> | |
202 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:phone/gmd:CI_Telephone/gmd:voice/gco:CharacterString"/> | |
203 | + </xsl:call-template> | |
204 | + <xsl:call-template name="tablerow"> | |
205 | + <xsl:with-param name="cname" select="'Facsimile'"/> | |
206 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:phone/gmd:CI_Telephone/gmd:facsimile/gco:CharacterString"/> | |
207 | + </xsl:call-template> | |
208 | + <xsl:call-template name="tablerow"> | |
209 | + <xsl:with-param name="cname" select="'Delivery Point'"/> | |
210 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:deliveryPoint/gco:CharacterString"/> | |
211 | + </xsl:call-template> | |
212 | + <xsl:call-template name="tablerow"> | |
213 | + <xsl:with-param name="cname" select="'City'"/> | |
214 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:city/gco:CharacterString"/> | |
215 | + </xsl:call-template> | |
216 | + <xsl:call-template name="tablerow"> | |
217 | + <xsl:with-param name="cname" select="'Postal code'"/> | |
218 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:postalCode/gco:CharacterString"/> | |
219 | + </xsl:call-template> | |
220 | + <xsl:call-template name="tablerow"> | |
221 | + <xsl:with-param name="cname" select="'Country'"/> | |
222 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:country/gco:CharacterString"/> | |
223 | + </xsl:call-template> | |
224 | + <xsl:call-template name="tablerow"> | |
225 | + <xsl:with-param name="cname" select="'Email'"/> | |
226 | + <xsl:with-param name="cvalue" select="./gmd:CI_ResponsibleParty/gmd:contactInfo/gmd:CI_Contact/gmd:address/gmd:CI_Address/gmd:electronicMailAddress/gco:CharacterString"/> | |
227 | + </xsl:call-template> | |
228 | +</table></td> | |
229 | +</tr> | |
230 | +</table> | |
231 | +</div> | |
232 | +</xsl:template> | |
233 | + | |
234 | +<!-- 'Identification->Geographic box' block --> | |
235 | +<xsl:template match="gmd:extent"> | |
236 | +<xsl:if test="./gmd:EX_Extent/gmd:geographicElement"> | |
237 | +<div class="captioneddiv"> | |
238 | +<h3>Geographic box</h3> | |
239 | +<br/> | |
240 | +<table class="meta" width="100%" align="center"><tr></tr> | |
241 | +<tr> | |
242 | +<td></td><td class="meta-param" align="center">North bound latitude<br/> | |
243 | +<font color="#000000"><xsl:value-of select="./gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:northBoundLatitude/gco:Decimal"/></font></td><td></td> | |
244 | +</tr> | |
245 | +<tr> | |
246 | +<td class="meta-param" align="center">West bound longitude<br/> | |
247 | +<font color="#000000"><xsl:value-of select="./gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude/gco:Decimal"/></font></td> | |
248 | +<td></td> | |
249 | +<td class="meta-param" align="center">East bound longitude<br/> | |
250 | +<font color="#000000"><xsl:value-of select="./gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:eastBoundLongitude/gco:Decimal"/></font></td> | |
251 | +</tr> | |
252 | +<tr> | |
253 | +<td></td><td class="meta-param" align="center">South bound latitude<br/> | |
254 | +<font color="#000000"><xsl:value-of select="./gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox/gmd:southBoundLatitude/gco:Decimal"/></font></td><td></td> | |
255 | +</tr> | |
256 | +</table> | |
257 | +</div> | |
258 | +</xsl:if> | |
259 | +</xsl:template> | |
260 | + | |
261 | +<!-- 'Distribution Info' block --> | |
262 | +<xsl:template match="gmd:MD_Distribution"> | |
263 | +<div class="captioneddiv"> | |
264 | +<h3>Distribution info</h3> | |
265 | +<table class="meta"><tr></tr> | |
266 | + <xsl:for-each select="gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource"> | |
267 | + <xsl:choose> | |
268 | + <xsl:when test="starts-with(./gmd:protocol/gco:CharacterString,'WWW:DOWNLOAD-') and contains(./gmd:protocol/gco:CharacterString,'http--download') and ./gmd:name/gco:CharacterString"> | |
269 | + <tr> | |
270 | + <td class="meta-param">Download:</td> | |
271 | + <td class="meta-value"> | |
272 | + <a><xsl:attribute name="href"> | |
273 | + <xsl:value-of select="gmd:linkage/gmd:URL"/> | |
274 | + </xsl:attribute> | |
275 | + <xsl:value-of select="gmd:name/gco:CharacterString"/> | |
276 | + </a> | |
277 | + </td> | |
278 | + </tr> | |
279 | + </xsl:when> | |
280 | + <xsl:when test="starts-with(./gmd:protocol/gco:CharacterString,'ESRI:AIMS-') and contains(./gmd:protocol/gco:CharacterString,'-get-image') and ./gmd:name/gco:CharacterString"> | |
281 | + <tr> | |
282 | + <td class="meta-param">Esri ArcIms:</td> | |
283 | + <td class="meta-value"> | |
284 | + <a><xsl:attribute name="href"> | |
285 | + <xsl:value-of select="gmd:linkage/gmd:URL"/> | |
286 | + </xsl:attribute> | |
287 | + <xsl:value-of select="gmd:name/gco:CharacterString"/> | |
288 | + </a> | |
289 | + </td> | |
290 | + </tr> | |
291 | + </xsl:when> | |
292 | + <xsl:when test="starts-with(./gmd:protocol/gco:CharacterString,'OGC:WMS-') and contains(./gmd:protocol/gco:CharacterString,'-get-map') and ./gmd:name/gco:CharacterString"> | |
293 | + <tr> | |
294 | + <td class="meta-param">OGC-WMS:</td> | |
295 | + <td class="meta-value"> | |
296 | + <a><xsl:attribute name="href"> | |
297 | + <xsl:text>javascript:void(window.open('</xsl:text> | |
298 | + <xsl:value-of select="gmd:linkage/gmd:URL"/> | |
299 | + <xsl:text>'))</xsl:text> | |
300 | + </xsl:attribute> | |
301 | + <xsl:value-of select="gmd:name/gco:CharacterString"/> | |
302 | + </a> | |
303 | + </td> | |
304 | + </tr> | |
305 | + </xsl:when> | |
306 | + <xsl:when test="starts-with(./gmd:protocol/gco:CharacterString,'OGC:WMS-') and contains(./gmd:protocol/gco:CharacterString,'-get-capabilities') and ./gmd:name/gco:CharacterString"> | |
307 | + <tr> | |
308 | + <td class="meta-param">OGC-WMS Capabilities:</td> | |
309 | + <td class="meta-value"> | |
310 | + <a><xsl:attribute name="href"> | |
311 | + <xsl:value-of select="gmd:linkage/gmd:URL"/> | |
312 | + </xsl:attribute> | |
313 | + <xsl:value-of select="gmd:name/gco:CharacterString"/> | |
314 | + </a> | |
315 | + </td> | |
316 | + </tr> | |
317 | + </xsl:when> | |
318 | + <!--xsl:when test="linkage[text()]"> | |
319 | + <link type="url"><xsl:value-of select="linkage[text()]"/></link> | |
320 | + </xsl:when--> | |
321 | + </xsl:choose> | |
322 | + </xsl:for-each> | |
323 | +</table> | |
324 | +</div> | |
325 | +</xsl:template> | |
326 | + | |
327 | +<!-- 'Identification->Abstract --> | |
328 | +<xsl:template match="gmd:abstract"> | |
329 | +<xsl:apply-templates select="./gco:CharacterString/text()"/> | |
330 | +</xsl:template> | |
331 | +<!-- End Metadata ISO19139 --> | |
332 | + | |
333 | + | |
334 | +<!-- StartMetadata Dublin Core --> | |
335 | + | |
336 | +<!-- 'Identification' block --> | |
337 | +<xsl:template match="*[local-name()='Record']|*[local-name()='SummaryRecord']|*[local-name()='BriefRecord']"> | |
338 | +<div class="captioneddiv"> | |
339 | +<h3>Identification info</h3> | |
340 | +<table class="meta"><tr></tr> | |
341 | + <xsl:call-template name="tablerow"> | |
342 | + <xsl:with-param name="cname" select="'Title'"/> | |
343 | + <xsl:with-param name="cvalue" select="./dc:title"/> | |
344 | + </xsl:call-template> | |
345 | + <xsl:call-template name="tablerow"> | |
346 | + <xsl:with-param name="cname" select="'Date'"/> | |
347 | + <xsl:with-param name="cvalue" select="./dc:date"/> | |
348 | + </xsl:call-template> | |
349 | + <xsl:call-template name="tablerow"> | |
350 | + <xsl:with-param name="cname" select="'Presentation form'"/> | |
351 | + <xsl:with-param name="cvalue" select="./dc:format"/> | |
352 | + </xsl:call-template> | |
353 | + <xsl:call-template name="tablerow"> | |
354 | + <xsl:with-param name="cname" select="'Individual name'"/> | |
355 | + <xsl:with-param name="cvalue" select="./dc:publisher"/> | |
356 | + </xsl:call-template> | |
357 | + <xsl:call-template name="tablerow"> | |
358 | + <xsl:with-param name="cname" select="'Identifier'"/> | |
359 | + <xsl:with-param name="cvalue" select="./dc:identifier"/> | |
360 | + </xsl:call-template> | |
361 | +<xsl:if test="./dct:abstract"> | |
362 | +<tr><!-- this "tr" causes problems for new line replacement by "p" --> | |
363 | +<td class="meta-param">Abstract:</td><td class="meta-value"><xsl:apply-templates select="./dct:abstract"/></td> | |
364 | +</tr> | |
365 | +</xsl:if> | |
366 | + <xsl:for-each select="./dc:subject"> | |
367 | + <xsl:call-template name="tablerow"> | |
368 | + <xsl:with-param name="cname" select="'Keyword'"/> | |
369 | + <xsl:with-param name="cvalue" select="."/> | |
370 | + </xsl:call-template> | |
371 | + </xsl:for-each> | |
372 | +</table> | |
373 | +<xsl:apply-templates select="./ows:BoundingBox"/> | |
374 | +<xsl:apply-templates select="./ows:WGS84BoundingBox"/> | |
375 | +</div> | |
376 | +</xsl:template> | |
377 | + | |
378 | + | |
379 | +<xsl:template match="dct:abstract"> | |
380 | +<!--xsl:value-of select="."/--> | |
381 | +<xsl:apply-templates select="text()"/> | |
382 | +</xsl:template> | |
383 | + | |
384 | +<!-- 'Identification->Geographic box' block --> | |
385 | +<xsl:template match="ows:BoundingBox|ows:WGS84BoundingBox"> | |
386 | +<div class="captioneddiv"> | |
387 | +<h3>Geographic box</h3> | |
388 | +<table class="meta"><tr></tr> | |
389 | + <xsl:call-template name="tablerow"> | |
390 | + <xsl:with-param name="cname" select="'Lower corner'"/> | |
391 | + <xsl:with-param name="cvalue" select="./ows:LowerCorner"/> | |
392 | + </xsl:call-template> | |
393 | + <xsl:call-template name="tablerow"> | |
394 | + <xsl:with-param name="cname" select="'Upper corner'"/> | |
395 | + <xsl:with-param name="cvalue" select="./ows:UpperCorner"/> | |
396 | + </xsl:call-template> | |
397 | +</table> | |
398 | +</div> | |
399 | +</xsl:template> | |
400 | +<!-- End Metadata Dublin Core --> | |
401 | + | |
402 | +<!-- Start Utills --> | |
403 | +<xsl:template match="text()"> | |
404 | + <xsl:call-template name="to-para"> | |
405 | + <xsl:with-param name="from" select="' '"/> | |
406 | + <xsl:with-param name="string" select="."/> | |
407 | + </xsl:call-template> | |
408 | +</xsl:template> | |
409 | + | |
410 | +<!-- replace all occurences of the character(s) `from' | |
411 | + by <p/> in the string `string'.--> | |
412 | +<xsl:template name="to-para" > | |
413 | + <xsl:param name="string"/> | |
414 | + <xsl:param name="from"/> | |
415 | + <xsl:choose> | |
416 | + <xsl:when test="contains($string,$from)"> | |
417 | + <xsl:value-of select="substring-before($string,$from)"/> | |
418 | + <!-- output a <p/> tag instead of `from' --> | |
419 | + <p/> | |
420 | + <xsl:call-template name="to-para"> | |
421 | + <xsl:with-param name="string" select="substring-after($string,$from)"/> | |
422 | + <xsl:with-param name="from" select="$from"/> | |
423 | + </xsl:call-template> | |
424 | + </xsl:when> | |
425 | + <xsl:otherwise> | |
426 | + <xsl:value-of select="$string"/> | |
427 | + </xsl:otherwise> | |
428 | + </xsl:choose> | |
429 | +</xsl:template> | |
430 | + | |
431 | + | |
432 | +<xsl:template name="tablerow" > | |
433 | + <xsl:param name="cname"/> | |
434 | + <xsl:param name="cvalue"/> | |
435 | + <xsl:choose> | |
436 | + <xsl:when test="string($cvalue)"> | |
437 | + <tr> | |
438 | + <td class="meta-param"><xsl:value-of select="$cname"/><xsl:text>: </xsl:text></td> | |
439 | + <td class="meta-value"><xsl:value-of select="$cvalue"/></td> | |
440 | + </tr> | |
441 | + </xsl:when> | |
442 | + <xsl:otherwise> | |
443 | + </xsl:otherwise> | |
444 | + </xsl:choose> | |
445 | +</xsl:template> | |
446 | +<!-- End Utills --> | |
447 | + | |
448 | +</xsl:stylesheet> | ... | ... |
... | ... | @@ -0,0 +1,146 @@ |
1 | +<?xml version="1.0"?> | |
2 | +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" | |
3 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | |
4 | + xmlns:dct="http://purl.org/dc/terms/"> | |
5 | +<!--xsl:output method="html" encoding="ISO-8859-1"/--> | |
6 | + | |
7 | + | |
8 | +<xsl:variable name="pageUrl"> | |
9 | + <xsl:text>javascript:(csw_client.getRecords</xsl:text> | |
10 | + <xsl:text>('</xsl:text> | |
11 | +</xsl:variable> | |
12 | + | |
13 | + | |
14 | +<xsl:template match="/results/*[local-name()='GetRecordsResponse']"> | |
15 | + <xsl:apply-templates select="./*[local-name()='SearchResults']"/> | |
16 | +</xsl:template> | |
17 | + | |
18 | + | |
19 | +<xsl:template match="*[local-name()='SearchResults']"> | |
20 | + | |
21 | + | |
22 | +<xsl:variable name="start"> | |
23 | + <xsl:value-of select="../../request/@start"/> | |
24 | +</xsl:variable> | |
25 | + | |
26 | +<!-- because GeoNetwork does not return nextRecord we have to do some calculation --> | |
27 | +<xsl:variable name="next"> | |
28 | + <xsl:choose> | |
29 | + <xsl:when test="@nextRecord"> | |
30 | + <xsl:value-of select="@nextRecord"/> | |
31 | + </xsl:when> | |
32 | + <xsl:otherwise> | |
33 | + <xsl:choose> | |
34 | + <xsl:when test="number(@numberOfRecordsMatched) >= (number($start) + number(@numberOfRecordsReturned))"> | |
35 | + <xsl:value-of select="number($start) + number(@numberOfRecordsReturned)"/> | |
36 | + </xsl:when> | |
37 | + <xsl:otherwise> | |
38 | + <xsl:value-of select="0"/> | |
39 | + </xsl:otherwise> | |
40 | + </xsl:choose> | |
41 | + </xsl:otherwise> | |
42 | + </xsl:choose> | |
43 | +</xsl:variable> | |
44 | + | |
45 | +<div class="captioneddiv"> | |
46 | + | |
47 | +<!--xsl:if test="number(@numberOfRecordsMatched) > number(@numberOfRecordsReturned)"--> | |
48 | +<!-- because ESRI GPT returns always numberOfRecordsMatched = 0 --> | |
49 | +<xsl:if test="number(@numberOfRecordsReturned) > 0 and ($start > 1 or number($next) > 0)"> | |
50 | + <h3 style="float:right;top: -2.5em;"> | |
51 | + <xsl:if test="$start > 1"> | |
52 | + <a> | |
53 | + <xsl:attribute name="href"> | |
54 | + <xsl:value-of select="$pageUrl"/> | |
55 | + <xsl:value-of select="number($start)-number(../../request/@maxrecords)"/> | |
56 | + <xsl:text>'))</xsl:text> | |
57 | + </xsl:attribute> | |
58 | + <xsl:text><< previous</xsl:text> | |
59 | + </a> | |
60 | + </xsl:if> | |
61 | + <xsl:text> || </xsl:text> | |
62 | + <xsl:if test="number($next) > 0"> | |
63 | + <a> | |
64 | + <xsl:attribute name="href"> | |
65 | + <xsl:value-of select="$pageUrl"/> | |
66 | + <xsl:value-of select="$next"/> | |
67 | + <xsl:text>'))</xsl:text> | |
68 | + </xsl:attribute> | |
69 | + <xsl:text>next >></xsl:text> | |
70 | + </a> | |
71 | + </xsl:if> | |
72 | + </h3> | |
73 | +</xsl:if> | |
74 | + | |
75 | +<h3>Total records returned: <xsl:value-of select="@numberOfRecordsReturned"/> | |
76 | +(of <xsl:value-of select="@numberOfRecordsMatched"/>) | |
77 | +</h3> | |
78 | + | |
79 | +<br/> | |
80 | + <ol> | |
81 | + <xsl:attribute name="start"> | |
82 | + <xsl:value-of select="$start"/> | |
83 | + </xsl:attribute> | |
84 | + <xsl:for-each select="./*[local-name()='SummaryRecord']|./*[local-name()='BriefRecord']|./*[local-name()='Record']"> | |
85 | + <li> | |
86 | + <strong><xsl:text>Title: </xsl:text></strong> | |
87 | + <a> | |
88 | + <xsl:attribute name="href"> | |
89 | + <xsl:text>javascript:(csw_client.getRecordById</xsl:text> | |
90 | + <xsl:text>('</xsl:text> | |
91 | + <xsl:value-of select="./dc:identifier"/> | |
92 | + <xsl:text>'))</xsl:text> | |
93 | + </xsl:attribute> | |
94 | + <xsl:choose> | |
95 | + <xsl:when test="./dc:title"> | |
96 | + <xsl:apply-templates select="./dc:title"/> | |
97 | + </xsl:when> | |
98 | + <xsl:otherwise> | |
99 | + <xsl:text> ...</xsl:text> | |
100 | + </xsl:otherwise> | |
101 | + </xsl:choose> | |
102 | + </a> | |
103 | + <br/> | |
104 | + <xsl:apply-templates select="./dct:abstract"/> | |
105 | + <br/> | |
106 | + <strong><xsl:text>Keywords: </xsl:text></strong> | |
107 | + <xsl:for-each select="./dc:subject"> | |
108 | + <xsl:if test=".!=''"> | |
109 | + <xsl:if test="position() > 1">, </xsl:if> | |
110 | + <i><xsl:value-of select="."/></i> | |
111 | + </xsl:if> | |
112 | + </xsl:for-each> | |
113 | + <hr/> | |
114 | + </li> | |
115 | + </xsl:for-each> | |
116 | + </ol> | |
117 | +</div> | |
118 | +</xsl:template> | |
119 | + | |
120 | +<xsl:template match="dc:title"> | |
121 | + <xsl:choose> | |
122 | + <xsl:when test=".!=''"> | |
123 | + <xsl:value-of select="."/> | |
124 | + </xsl:when> | |
125 | + <xsl:otherwise> | |
126 | + <xsl:text> ...</xsl:text> | |
127 | + </xsl:otherwise> | |
128 | + </xsl:choose> | |
129 | +</xsl:template> | |
130 | + | |
131 | +<xsl:template match="dct:abstract"> | |
132 | + <strong><xsl:text>Abstract: </xsl:text></strong> | |
133 | + <xsl:value-of select="substring(.,1,250)"/> | |
134 | + <xsl:text> ...</xsl:text> | |
135 | + <a> | |
136 | + <xsl:attribute name="href"> | |
137 | + <xsl:text>javascript:(csw_client.getRecordById</xsl:text> | |
138 | + <xsl:text>('</xsl:text> | |
139 | + <xsl:value-of select="../dc:identifier"/> | |
140 | + <xsl:text>'))</xsl:text> | |
141 | + </xsl:attribute> | |
142 | + <xsl:text> more</xsl:text> | |
143 | + </a> | |
144 | +</xsl:template> | |
145 | + | |
146 | +</xsl:stylesheet> | ... | ... |
... | ... | @@ -0,0 +1,32 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<xsl:stylesheet version="1.0" | |
3 | + xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" | |
4 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | |
5 | + xmlns:xlink="http://www.w3.org/1999/xlink"> | |
6 | + | |
7 | + <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes"/> | |
8 | + <xsl:strip-space elements="*"/> | |
9 | + | |
10 | + <!-- Match Root --> | |
11 | + <xsl:template match="/defaults"> | |
12 | + | |
13 | + <csw:GetRecordById | |
14 | + xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" | |
15 | + service = "CSW"> | |
16 | + <xsl:attribute name="version"> | |
17 | + <xsl:value-of select="./version"/> | |
18 | + </xsl:attribute> | |
19 | + <xsl:attribute name="outputFormat"> | |
20 | + <xsl:value-of select="./outputformat"/> | |
21 | + </xsl:attribute> | |
22 | + <xsl:attribute name="outputSchema"> | |
23 | + <xsl:value-of select="./outputschema"/> | |
24 | + </xsl:attribute> | |
25 | + <csw:Id> | |
26 | + <xsl:value-of select="./id"/> | |
27 | + </csw:Id> | |
28 | + <csw:ElementSetName>full</csw:ElementSetName> | |
29 | + </csw:GetRecordById> | |
30 | + | |
31 | + </xsl:template> | |
32 | +</xsl:stylesheet> | |
0 | 33 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,71 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<xsl:stylesheet version="1.0" | |
3 | + xmlns:ogc="http://www.opengis.net/ogc" | |
4 | + xmlns:ows="http://www.opengis.net/ows" | |
5 | + xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" | |
6 | + xmlns:gml="http://www.opengis.net/gml" | |
7 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | |
8 | + xmlns:xlink="http://www.w3.org/1999/xlink"> | |
9 | + | |
10 | + <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes"/> | |
11 | + <xsl:strip-space elements="*"/> | |
12 | + | |
13 | + | |
14 | + <!-- Match Root --> | |
15 | + <xsl:template match="/defaults"> | |
16 | + | |
17 | + <csw:GetRecords | |
18 | + xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" | |
19 | + service = "CSW"> | |
20 | + <xsl:attribute name="version"> | |
21 | + <xsl:value-of select="./version"/> | |
22 | + </xsl:attribute> | |
23 | + <xsl:attribute name="maxRecords"> | |
24 | + <xsl:value-of select="./maxrecords"/> | |
25 | + </xsl:attribute> | |
26 | + <xsl:attribute name="startPosition"> | |
27 | + <xsl:value-of select="./startposition"/> | |
28 | + </xsl:attribute> | |
29 | + <xsl:attribute name="outputFormat"> | |
30 | + <xsl:value-of select="./outputformat"/> | |
31 | + </xsl:attribute> | |
32 | + <xsl:attribute name="outputSchema"> | |
33 | + <xsl:value-of select="./outputschema"/> | |
34 | + </xsl:attribute> | |
35 | + <xsl:attribute name="resultType"> | |
36 | + <xsl:value-of select="./resulttype"/> | |
37 | + </xsl:attribute> | |
38 | + <csw:Query typeNames="csw:Record"> | |
39 | + <csw:ElementSetName>summary</csw:ElementSetName> | |
40 | + <!-- Don't add Constraint if searh term is empty; this keeps Geonetwork happy --> | |
41 | + <xsl:if test="./literal !=''"> | |
42 | + <csw:Constraint version="1.1.0"> | |
43 | + <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> | |
44 | + <ogc:PropertyIsLike escape="\" singleChar="_" wildCard="%"> | |
45 | + <ogc:PropertyName> | |
46 | + <xsl:value-of select="./propertyname"/> | |
47 | + </ogc:PropertyName> | |
48 | + <ogc:Literal> | |
49 | + <xsl:value-of select="./literal"/> | |
50 | + </ogc:Literal> | |
51 | + </ogc:PropertyIsLike> | |
52 | + </ogc:Filter> | |
53 | + </csw:Constraint> | |
54 | + </xsl:if> | |
55 | + <ogc:SortBy xmlns:ogc="http://www.opengis.net/ogc"> | |
56 | + <xsl:if test="./sortby !=''"> | |
57 | + <ogc:SortProperty> | |
58 | + <ogc:PropertyName> | |
59 | + <xsl:value-of select="./sortby"/> | |
60 | + </ogc:PropertyName> | |
61 | + <ogc:SortOrder> | |
62 | + <xsl:value-of select="./sortorder"/> | |
63 | + </ogc:SortOrder> | |
64 | + </ogc:SortProperty> | |
65 | + </xsl:if> | |
66 | + </ogc:SortBy> | |
67 | + </csw:Query> | |
68 | + </csw:GetRecords> | |
69 | + | |
70 | + </xsl:template> | |
71 | +</xsl:stylesheet> | |
0 | 72 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,134 @@ |
1 | +<?xml version="1.0"?> | |
2 | +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
3 | +<!--xsl:output method="html" encoding="ISO-8859-1"/--> | |
4 | + | |
5 | + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> | |
6 | + <!-- XML formatting --> | |
7 | + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> | |
8 | + | |
9 | + <!-- | |
10 | + draws an element as xml document | |
11 | + --> | |
12 | + <xsl:template match="/"> | |
13 | + <div class="captioneddiv"> | |
14 | + <h3>XML presentation</h3> | |
15 | + <br/> | |
16 | + <xsl:apply-templates mode="showXMLElement" select="."/> | |
17 | + </div> | |
18 | + </xsl:template> | |
19 | + | |
20 | + | |
21 | + <!-- | |
22 | + draws an element in xml | |
23 | + --> | |
24 | + <xsl:template mode="showXMLElement" match="*"> | |
25 | + <xsl:choose> | |
26 | + | |
27 | + <!-- has children --> | |
28 | + <xsl:when test="*"> | |
29 | + <xsl:call-template name="showXMLStartTag"/> | |
30 | + <dl> | |
31 | + <xsl:for-each select="*"> | |
32 | + <dd> | |
33 | + <xsl:apply-templates select="." mode="showXMLElement"/> | |
34 | + </dd> | |
35 | + </xsl:for-each> | |
36 | + </dl> | |
37 | + <xsl:call-template name="showEndTag"/> | |
38 | + </xsl:when> | |
39 | + | |
40 | + <!-- no children but text --> | |
41 | + <xsl:when test="text()"> | |
42 | + <xsl:call-template name="showXMLStartTag"/> | |
43 | + <xsl:value-of select="text()"/> | |
44 | + <xsl:call-template name="showEndTag"/> | |
45 | + </xsl:when> | |
46 | + | |
47 | + <!-- empty element --> | |
48 | + <xsl:otherwise> | |
49 | + <xsl:call-template name="showXMLStartEndTag"/> | |
50 | + </xsl:otherwise> | |
51 | + </xsl:choose> | |
52 | + </xsl:template> | |
53 | + | |
54 | + <!-- | |
55 | + draws the start tag of an element | |
56 | + --> | |
57 | + <xsl:template name="showXMLStartTag"> | |
58 | + <font color="#4444ff"> | |
59 | + <xsl:text><</xsl:text> | |
60 | + <xsl:value-of select="name(.)"/> | |
61 | + <xsl:call-template name="showXMLNamespaces"/> | |
62 | + <xsl:call-template name="showXMLAttributes"/> | |
63 | + <xsl:text>></xsl:text> | |
64 | + </font> | |
65 | + </xsl:template> | |
66 | + | |
67 | + <!-- | |
68 | + draws the end tag of an element | |
69 | + --> | |
70 | + <xsl:template name="showEndTag"> | |
71 | + <font color="#4444ff"> | |
72 | + <xsl:text></</xsl:text> | |
73 | + <xsl:value-of select="name(.)"/> | |
74 | + <xsl:text>></xsl:text> | |
75 | + </font> | |
76 | + </xsl:template> | |
77 | + | |
78 | + <!-- | |
79 | + draws the empty tag of an element | |
80 | + --> | |
81 | + <xsl:template name="showXMLStartEndTag"> | |
82 | + <font color="#4444ff"> | |
83 | + <xsl:text><</xsl:text> | |
84 | + <xsl:value-of select="name(.)"/> | |
85 | + </font> | |
86 | + <xsl:call-template name="showXMLNamespaces"/> | |
87 | + <xsl:call-template name="showXMLAttributes"/> | |
88 | + <font color="#4444ff"> | |
89 | + <xsl:text>/></xsl:text> | |
90 | + </font> | |
91 | + </xsl:template> | |
92 | + | |
93 | + <!-- | |
94 | + draws attributes of an element | |
95 | + --> | |
96 | + <xsl:template name="showXMLAttributes"> | |
97 | + <xsl:for-each select="@*"> | |
98 | + <xsl:text> </xsl:text> | |
99 | + <font color="#44aa44"> | |
100 | + <xsl:value-of select="name(.)"/> | |
101 | + </font> | |
102 | + <xsl:text>=</xsl:text> | |
103 | + <font color="#ff4444"> | |
104 | + <xsl:text>"</xsl:text> | |
105 | + <xsl:value-of select="string()"/> | |
106 | + <xsl:text>"</xsl:text> | |
107 | + </font> | |
108 | + </xsl:for-each> | |
109 | + </xsl:template> | |
110 | + | |
111 | + <!-- | |
112 | + draws namespaces of an element | |
113 | + --> | |
114 | + <xsl:template name="showXMLNamespaces"> | |
115 | + <xsl:variable name="parent" select=".."/> | |
116 | + <xsl:for-each select="namespace::*"> | |
117 | + <xsl:if test="not(.=$parent/namespace::*) and name()!='geonet'"> | |
118 | + <xsl:text> xmlns</xsl:text> | |
119 | + <xsl:if test="name()"> | |
120 | + <xsl:text>:</xsl:text> | |
121 | + <xsl:value-of select="name()"/> | |
122 | + </xsl:if> | |
123 | + <xsl:text>=</xsl:text> | |
124 | + <font color="#888844"> | |
125 | + <xsl:text>"</xsl:text> | |
126 | + <xsl:value-of select="string()"/> | |
127 | + <xsl:text>"</xsl:text> | |
128 | + </font> | |
129 | + </xsl:if> | |
130 | + </xsl:for-each> | |
131 | + </xsl:template> | |
132 | + | |
133 | +</xsl:stylesheet> | |
134 | + | ... | ... |