[ Index ] |
|
Code source de Kupu-1.3.5 |
1 /***************************************************************************** 2 * 3 * Sarissa XML library version 0.9.6 4 * Copyright (c) 2003 Manos Batsis, 5 * mailto: mbatsis at users full stop sourceforge full stop net 6 * This software is distributed under the Kupu License. See 7 * LICENSE.txt for license text. See the Sarissa homepage at 8 * http://sarissa.sourceforge.net for more information. 9 * 10 ***************************************************************************** 11 12 * ==================================================================== 13 * About 14 * ==================================================================== 15 * Sarissa cross browser XML library - IE XPath Emulation 16 * @version 0.9.6 17 * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net 18 * 19 * This script emulates Internet Explorer's selectNodes and selectSingleNode 20 * for Mozilla. Associating namespace prefixes with URIs for your XPath queries 21 * is easy with IE's setProperty. 22 * USers may also map a namespace prefix to a default (unprefixed) namespace in the 23 * source document with Sarissa.setXpathNamespaces 24 * 25 */ 26 if(_SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){ 27 /** 28 * <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>, 29 * so it also has some properties IEs proprietery object features.</p> 30 * @private 31 * @constructor 32 * @argument i the (initial) list size 33 */ 34 function SarissaNodeList(i){ 35 this.length = i; 36 }; 37 /** <p>Set an Array as the prototype object</p> */ 38 SarissaNodeList.prototype = new Array(0); 39 /** <p>Inherit the Array constructor </p> */ 40 SarissaNodeList.prototype.constructor = Array; 41 /** 42 * <p>Returns the node at the specified index or null if the given index 43 * is greater than the list size or less than zero </p> 44 * <p><b>Note</b> that in ECMAScript you can also use the square-bracket 45 * array notation instead of calling <code>item</code> 46 * @argument i the index of the member to return 47 * @returns the member corresponding to the given index 48 */ 49 SarissaNodeList.prototype.item = function(i) { 50 return (i < 0 || i >= this.length)?null:this[i]; 51 }; 52 /** 53 * <p>Emulate IE's expr property 54 * (Here the SarissaNodeList object is given as the result of selectNodes).</p> 55 * @returns the XPath expression passed to selectNodes that resulted in 56 * this SarissaNodeList 57 */ 58 SarissaNodeList.prototype.expr = ""; 59 /** dummy, used to accept IE's stuff without throwing errors */ 60 XMLDocument.prototype.setProperty = function(x,y){}; 61 /** 62 * <p>Programmatically control namespace URI/prefix mappings for XPath 63 * queries.</p> 64 * <p>This method comes especially handy when used to apply XPath queries 65 * on XML documents with a default namespace, as there is no other way 66 * of mapping that to a prefix.</p> 67 * <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you 68 * are looking for elements in the null namespace. If you need to look 69 * for nodes in the default namespace, you need to map a prefix to it 70 * first like:</p> 71 * <pre>Sarissa.setXpathNamespaces(oDoc, "xmlns:myprefix=&aposhttp://mynsURI&apos");</pre> 72 * <p><b>Note 1 </b>: Use this method only if the source document features 73 * a default namespace (without a prefix), otherwise just use IE's setProperty 74 * (moz will rezolve non-default namespaces by itself). You will need to map that 75 * namespace to a prefix for queries to work.</p> 76 * <p><b>Note 2 </b>: This method calls IE's setProperty method to set the 77 * appropriate namespace-prefix mappings, so you dont have to do that.</p> 78 * @param oDoc The target XMLDocument to set the namespace mappings for. 79 * @param sNsSet A whilespace-seperated list of namespace declarations as 80 * those would appear in an XML document. E.g.: 81 * <code>"xmlns:xhtml='http://www.w3.org/1999/xhtml' 82 * xmlns:'http://www.w3.org/1999/XSL/Transform'"</code> 83 * @throws An error if the format of the given namespace declarations is bad. 84 */ 85 Sarissa.setXpathNamespaces = function(oDoc, sNsSet) { 86 //oDoc._sarissa_setXpathNamespaces(sNsSet); 87 oDoc._sarissa_useCustomResolver = true; 88 var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):new Array(sNsSet); 89 oDoc._sarissa_xpathNamespaces = new Array(namespaces.length); 90 for(var i=0;i < namespaces.length;i++){ 91 var ns = namespaces[i]; 92 var colonPos = ns.indexOf(":"); 93 var assignPos = ns.indexOf("="); 94 if(colonPos == 5 && assignPos > colonPos+2){ 95 var prefix = ns.substring(colonPos+1, assignPos); 96 var uri = ns.substring(assignPos+2, ns.length-1); 97 oDoc._sarissa_xpathNamespaces[prefix] = uri; 98 }else{ 99 throw "Bad format on namespace declaration(s) given"; 100 }; 101 }; 102 }; 103 /** 104 * @private Flag to control whether a custom namespace resolver should 105 * be used, set to true by Sarissa.setXpathNamespaces 106 */ 107 XMLDocument.prototype._sarissa_useCustomResolver = false; 108 /** @private */ 109 XMLDocument.prototype._sarissa_xpathNamespaces = new Array(); 110 /** 111 * <p>Extends the XMLDocument to emulate IE's selectNodes.</p> 112 * @argument sExpr the XPath expression to use 113 * @argument contextNode this is for internal use only by the same 114 * method when called on Elements 115 * @returns the result of the XPath search as a SarissaNodeList 116 * @throws An error if no namespace URI is found for the given prefix. 117 */ 118 XMLDocument.prototype.selectNodes = function(sExpr, contextNode){ 119 var nsDoc = this; 120 var nsresolver = this._sarissa_useCustomResolver 121 ? function(prefix){ 122 var s = nsDoc._sarissa_xpathNamespaces[prefix]; 123 if(s)return s; 124 else throw "No namespace URI found for prefix: '" + prefix+"'"; 125 } 126 : this.createNSResolver(this.documentElement); 127 var oResult = this.evaluate(sExpr, 128 (contextNode?contextNode:this), 129 nsresolver, 130 XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 131 var nodeList = new SarissaNodeList(oResult.snapshotLength); 132 nodeList.expr = sExpr; 133 for(var i=0;i<nodeList.length;i++) 134 nodeList[i] = oResult.snapshotItem(i); 135 return nodeList; 136 }; 137 /** 138 * <p>Extends the Element to emulate IE's selectNodes</p> 139 * @argument sExpr the XPath expression to use 140 * @returns the result of the XPath search as an (Sarissa)NodeList 141 * @throws An 142 * error if invoked on an HTML Element as this is only be 143 * available to XML Elements. 144 */ 145 Element.prototype.selectNodes = function(sExpr){ 146 var doc = this.ownerDocument; 147 if(doc.selectNodes) 148 return doc.selectNodes(sExpr, this); 149 else 150 throw "Method selectNodes is only supported by XML Elements"; 151 }; 152 /** 153 * <p>Extends the XMLDocument to emulate IE's selectSingleNodes.</p> 154 * @argument sExpr the XPath expression to use 155 * @argument contextNode this is for internal use only by the same 156 * method when called on Elements 157 * @returns the result of the XPath search as an (Sarissa)NodeList 158 */ 159 XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){ 160 var ctx = contextNode?contextNode:null; 161 sExpr = "("+sExpr+")[1]"; 162 var nodeList = this.selectNodes(sExpr, ctx); 163 if(nodeList.length > 0) 164 return nodeList.item(0); 165 else 166 return null; 167 }; 168 /** 169 * <p>Extends the Element to emulate IE's selectNodes.</p> 170 * @argument sExpr the XPath expression to use 171 * @returns the result of the XPath search as an (Sarissa)NodeList 172 * @throws An error if invoked on an HTML Element as this is only be 173 * available to XML Elements. 174 */ 175 Element.prototype.selectSingleNode = function(sExpr){ 176 var doc = this.ownerDocument; 177 if(doc.selectSingleNode) 178 return doc.selectSingleNode(sExpr, this); 179 else 180 throw "Method selectNodes is only supported by XML Elements"; 181 }; 182 Sarissa.IS_ENABLED_SELECT_NODES = true; 183 };
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 15:30:41 2007 | par Balluche grâce à PHPXref 0.7 |