XPath选择在Microsoft Edge中不起作用(适用于Chrome和Firefox)

时间:2016-01-12 15:08:00

标签: javascript xml xpath microsoft-edge

尝试从XML文档中选择特定行或一组行时Microsoft Edge始终返回第一行。另一个浏览器处理选择就好了。

我使用与相关网站上完全相同的代码和XML进行了小型演示。

https://jsbin.com/wufoyisudi/edit?html,output

在文本框中输入'aar'时按下提交,第一行的第一个PortERPID将返回。但是,当在文本框中输入'abi'时,应返回第二行的PortERPID。这在Chrome和Firefox中运行良好,但在Microsoft边缘不起作用。

XML:

<ROOT>
<FAKE>
    <row PortERPID="DKAAR" PortName="AARHUS"/>
    <row PortERPID="CIABJ" PortName="ABIDJAN"/>
</FAKE>
</ROOT>

JavaScript的:

var val = document.getElementById("filter").value;
var xml = '<ROOT><FAKE>' + 
          '<row PortERPID="DKAAR" PortName="AARHUS"/>' + 
          '<row PortERPID="CIABJ" PortName="ABIDJAN"/>' + 
          '</FAKE></ROOT>';

var parser=new DOMParser();
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";               
xmlDoc = parser.parseFromString(xml,"text/xml");

var portsERPIDXpath = "//row[@PortName[contains(translate(.,'abcdefghijklmnopqrstuvwxyz'," + " 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),'" + val.toUpperCase() + "')]]/@PortERPID";
var ERPIDS = xmlDoc.evaluate(portsERPIDXpath, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var ERPID = ERPIDS.snapshotItem(0).value;
document.getElementById("result").innerHTML = ERPID;

请记住,这是旧代码,它将被新系统取代,因此完全重写不是一种选择。

关于可能的修复/解决方法的任何想法?

编辑:

我能够通过将XPATH表达式重写为

来解决问题
//row[contains(translate(@PortName,'abcdefghijklmnopqrstuvwxyz'," + " 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),'" + val.toUpperCase() + "')]/@PortERPID

我不知道为什么会这样,因为它基本上是相同的表达式,但它有效。

1 个答案:

答案 0 :(得分:0)

或许querySelector有更好的支持:

      var el = xmlDoc.querySelector('row[PortName*="' + value.toUpperCase() + '"]');
      if (el != null) {
        var ERPID = el.getAttribute('PortERPID');
        document.getElementById("result").innerHTML = ERPID;
      }