Firefox 如何使用XUL返回标记的XPath?

Firefox 如何使用XUL返回标记的XPath?,firefox,firefox-addon,xul,Firefox,Firefox Addon,Xul,我想选择标记的XPath和标记的内容,类似于正在做的事情。但是,我找不到任何例子。这是如何实现的?经过一些研究,我们发现: function createXPathFromElement(elm) { var allNodes = document.getElementsByTagName('*'); for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode)

我想选择标记的XPath和标记的内容,类似于正在做的事情。但是,我找不到任何例子。这是如何实现的?

经过一些研究,我们发现:

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; 
    }
函数createXPathFromElement(elm){
var allNodes=document.getElementsByTagName('*');
对于(segs=[];elm&&elm.nodeType==1;elm=elm.parentNode)
{
if(elm.hasAttribute('id')){
var uniqueIdCount=0;
对于(var n=0;n1)中断;
}; 
如果(uniqueIdCount==1){
segs.unshift('id('+elm.getAttribute('id')+'));
返回segs.join('/');
}否则{
segs.unshift(elm.localName.toLowerCase()+”[@id=“”+elm.getAttribute('id')+“]);
} 
}else if(elm.hasAttribute('class')){
segs.unshift(elm.localName.toLowerCase()+”[@class=“”+elm.getAttribute('class')+“]);
}否则{
对于(i=1,sib=elm.previousSibling;sib;sib=sib.previousSibling){
if(sib.localName==elm.localName)i++;
}; 
segs.unshift(elm.localName.toLowerCase()++'['+i+']');
}; 
};
返回segs.length?'/'+segs.join('/'):null;
}
函数lookupElementByXPath(路径){
var evaluator=新的XPathEvaluator();
var result=evaluator.evaluate(路径,document.documentElement,null,XPathResult.FIRST\u ORDERED\u NODE\u TYPE,null);
返回result.singleNodeValue;
}

您知道没有“标记的XPath”吗?您可以通过许多不同的XPath表达式选择相同的标记,您想要哪一个?我猜您希望按照元素在文档中的位置进行操作,类似于正在执行的操作?