Cum pot returna XPath-ul unei etichete utilizând XUL?

Aș dori să select XPath-ul unei etichete și conținutul etichetei, ceva similar cu ceea ce Evernote face. Cu toate acestea, nu găsesc niciun exemplu. Cum s-ar putea realiza acest lucru?

0
Știți că nu există "XPath-ul unei etichete"? Ați putea selecta aceeași etichetă prin multe expresii XPath, care doriți? Cred că doriți să treceți de poziția elementului în document, similar cu ceea ce Eliminați Este permanent ?
adăugat autor Wladimir Palant, sursa

1 răspunsuri

După câteva cercetări, am găsit acest lucru:

function createXPathFromElement(elm) {
        var allNodes = document.getElementsByTagName('*'); 
        for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) 
        {
            if (elm.hasAttribute('id')) { 
                var uniqueIdCount = 0; 
                for (var n=0;n < allNodes.length;n++) { 
                    if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++; 
                    if (uniqueIdCount > 1) break; 
                }; 
                if ( uniqueIdCount == 1) { 
                    segs.unshift('id("' + elm.getAttribute('id') + '")'); 
                    return segs.join('/'); 
                } else { 
                    segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]'); 
                } 
            } else if (elm.hasAttribute('class')) { 
                segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]'); 
            } else { 
                for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) { 
                    if (sib.localName == elm.localName)  i++;
                }; 
                segs.unshift(elm.localName.toLowerCase() + '[' + i + ']'); 
            }; 
        };
        return segs.length ? '/' + segs.join('/') : null; 
    }

    function lookupElementByXPath(path) {
        var evaluator = new XPathEvaluator(); 
        var result = evaluator.evaluate(path, document.documentElement, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
        return  result.singleNodeValue; 
    }
0
adăugat