我试图在IE9中进行一些xpath查询,其中一些排序成功,但肯定只是尝试,我无法清楚地弄清楚是什么
可以
工作什么的。
我想做两件事:
-
从加载的xml查询自定义命名空间中的元素
-
查询内联svg中具有自定义名称空间属性的元素
第一点是有效的,使用以下代码:
doc.setProperty( "SelectionLanguage", "XPath" );
doc.setProperty( "SelectionNamespaces", xpathNsString );
svg = cloneSVGNode( doc.selectSingleNode( '//graphic/svg:svg' ) );
哪里
doc
是对加载的xml的引用,xpathNsString是:
"xmlns=\"http://www.w3.org/1999/xhtml\" " +
"xmlns:svg=\"http://www.w3.org/2000/svg\" "+
"xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "+
"xmlns:cc=\"http://creativecommons.org/ns#\" "+
"xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "+
"xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" "+
"xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" "+
"xmlns:mine=\"http://www.mine.org\" "+
"xmlns:html=\"http://www.w3.org/1999/xhtml\"";
和
cloneSVGNode
一个克隆整个结果的函数,这样我就可以将它附加到DOM中——这很有效。
在代码的后面,我想使用这样的查询来查询(现在在DOM中)SVG的一些元素:
//svg:g[@mine:my-name="my-value"]
但这并不奏效。我读到IE不支持对DOM元素的xpath查询,但在
this stackoverflow question
似乎有办法做到这一点。所以我找到了问题答案中提到的框架的一个版本(
http://sourceforge.net/projects/html-xpath/
)并做了一些测试。
因此,我能够获得一些html元素,但它拒绝用于名称空间和svg,而这在“纯xml”上是有效的。尽管如此,通过浏览lib的源代码,我可以看到以下策略(我不完全确定,但我认为总的来说是这样的):
-
将节点克隆到新的xml文档中
-
查询xpath
-
返回真实节点的对应节点
那么,当可以在xml上进行并将DOM节点转换为xml时,是否可以让IE9对DOM进行名称空间的xpath查询?
问候菲利浦
编辑:
我继续尝试,最终我可以成功,不知怎么的,代码很安静,一团糟,但它能带来结果。所以我现在可以说:
“答案是肯定的,这是可能的。”
。它仍然需要一些测试,但总体方法是:
-
创建一个新的空xml文档
-
设置适当的命名空间属性(如上所述)!重要的
-
递归地遍历上下文文档的树、通过新的xml文档创建新元素来克隆所有元素,
-
从而:从上下文文档的元素生成唯一id,并将其分配给克隆的元素和上下文文档的任何元素(如果没有)。然后在id键控的哈希映射中插入包含“original”和“cloned”元素的对象。
-
使用xpath查询新文档
-
检索结果,获取id并从映射中获取原始元素。
-
我决定从最初没有的元素中删除所有id。
完成。。。
如果有人感兴趣,我可以发布一些代码。。。