JavaScript中不区分大小写的XPath节点匹配

时间:2014-07-01 19:06:42

标签: javascript xml xpath

我正在尝试使用JavaScript来解析VMAP file。我目前的工作代码看起来像这样:

function equalsIgnoreCase(a, b) {
    return a.toLowerCase() == b.toLowerCase();
}

for(var i = 0, l = xml.childNodes.length; i < l; i++) {
    var node = xml.childNodes[i];
    if( equalsIgnoreCase( node.tagName, 'adbreak' ) ) {
        // Do stuff
    } else {
        // Unexpected tag
    }
}

这种方法的问题在于我有一个很多我正在检查的标签,而不仅仅是AdBreak(自定义扩展),而且编写大量的if / else是非常多余的形式的瀑布:

if( equalsIgnoreCase( node.tagName, 'adbreak' ) ) {
    // ...
} else if( equalsIgnoreCase( node.tagName, 'otherTag1' ) {
    // ...
} else if( equalsIgnoreCase( node.tagname, 'otherTag2' ) {
    // ...
} else if....

我最好使用XPath来解决我的所有问题。然后我的所有代码都可以压缩成一行:

var contentURI = XpathWrapper( xml, 'Extensions/MyExtension/Content' ).iterateNext().text();
var splashScreen = XpathWrapper( xml, 'Extensions/MyExtension/Splash' ).iterateNext().text();
// ...

这个问题是Xpath区分大小写。我在网上找到了一些建议,说你可以使用transform方法使Xpath不区分大小写,但这在实践中没有用:

// This fails:
XpathWrapper( xml, "*[transform(node(), 'ABCD...', 'abcd...') = 'extensions']" )

我确实找到了一条有效的建议,但它远非有用:

// This works:
XpathWrapper( xml, "Extensions | EXTENSIONS | extensions | EXTensions | ..." );

有没有办法让这项工作(无需键入每个字符串800种方式)?请注意,我不需要维护原始XML的结构,因此如果有办法在执行任何Xpath搜索之前将整个文档简单地转换为小写,那么这是可以接受的。

1 个答案:

答案 0 :(得分:1)

我对JavaScript世界中的XPath知之甚少,但仅仅关注你的XPath,至少有两件事需要修复:

  1. 使用translate() instead of transform()
  2. 使用name()代替node()来匹配元素名称
  3. 尝试使用此XPath:

    //*[translate(name(), 'ABCD...', 'abcd...') = 'extensions']