Annotation of kupuMPIWG/common/sarissa_ieemu_xpath.js, revision 1.1.1.1

1.1       dwinter     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, &quot;xmlns:myprefix=&amp;aposhttp://mynsURI&amp;apos&quot;);</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>&quot;xmlns:xhtml=&apos;http://www.w3.org/1999/xhtml&apos;
                     82:     * xmlns:&apos;http://www.w3.org/1999/XSL/Transform&apos;&quot;</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: };

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>