我想做什么:
我想找到正确的 xpath 来计算(或列出)引用活动节点的链接。
我的上下文是带有以下分离的 dom 树的 javascript,用于查询 xpath,document.evaluate 给出了一个特定的入口点。
作为示例,我们将//*[@id="n11"]视为入口点或活动节点(第二个 document.evaluate 参数)
这里是分离的 dom 树:
<root>
<node>
<a id="n1"/>
<a id="n2"/>
<a id="n3"/>
<a id="n4"/>
<a id="n5"/>
<a id="n10"/>
<a id="n11"/>
<a id="n12"/>
</node>
<link>
<a><source>n1</source><target>n2</target></a>
<a><source>n1</source><target>n11</target></a>
<a><source>n11</source><target>n3</target></a>
<a><source>n5</source><target>n5</target></a>
</link>
</root>
我已经尝试了几件事,但都没有给我预期的结果:
没有链接的节点:
/node/*[not(@id = /link/*/source | /link/*/target)]
具有一个链接的节点:
/node/*[@id = /link/*[not(target = following::source | following::target | preceding::source | preceding::target)]/target] | /node/*[@id = /link/*[not(source = following::source | following::target | preceding::source | preceding::target)]/source]
- 具有多个链接的节点
/node/*[@id = /link/*[target = following::source | following::target | preceding::source | preceding::target]/target] | /node/*[@id = /link/*[source = following::source | following::target | preceding::source | preceding::target]/source]
但是这些论文没有给我当前节点的链接号。
这不起作用:count(./[@id = /link/*[target | source]])
这不是更好:count(/link/*[current()/@id = target | source]])
因为当前存在于 xslt 上下文中,而不是仅 xpath 上下文中。
有 xpath 方式吗?
我在想的另外两种方法是:重新设计我的 dom 树以使其更像这样:
<root>
<node id="n1"/>
<node id="n2"/>
<node id="n3"/>
<node id="n4"/>
<node id="n5"/>
<node id="n10"/>
<node id="n11"/>
<node id="n12"/>
<link source="n1" target="n2"/>
<link source="n1" target="n11"/>
<link source="n11" target="n3"/>
<link source="n5" target="n5"/>
</root>
但是对于第一个 dom 树,我可以将任何 json 转换为 dom 并使用 xpath 查询它,在第二个 dom 树中,我更依赖于数据结构。
我看到的另一种方法是像这样(在第一个 dom 树上)执行递归 xpath:
count(/link/*[target | source = {concat('"',@id,'"')}]])
并在 javascript 中寻找嵌套的 xpath,评估它们,在父级中替换它们并评估父级 xpath。它可以在这里解决问题,但是当嵌套的 xpath 返回节点集而不是字符串时会更难处理。
最后,为什么我要这样做?对于这个项目:https ://github.com/1twitif/social-viz 我想给想要高级配置的用户提供 xpath 权力,但不给他们 javascript 的全部权力来过滤那里的数据以避免 xss 评估用户不受信任的 js脚本。