0

我想做什么:

我想找到正确的 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脚本。

4

0 回答 0