Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 将图形与XML树同步并对其应用轴_Xpath_Xquery - Fatal编程技术网

Xpath 将图形与XML树同步并对其应用轴

Xpath 将图形与XML树同步并对其应用轴,xpath,xquery,Xpath,Xquery,我将一个具有循环和多个父对象的图转换为XML,这样我就可以对其使用XQuery。 图表在左边,XML树在右边。 我通过写下第一个节点(节点1)中的所有子节点来转换图,并在返回的节点上重复该操作,直到不再存在子节点或者已经访问了一个节点(如节点2)。 此外,我还添加了一个约束,即如果选择了其中一个节点,则必须选择具有相同编号的所有节点。(例如,如果选择了节点2(1的子节点),那么我们还必须在XML树中选择节点2(6的子节点) 我可以在图上使用的操作有:getPatents、getChildren、

我将一个具有循环和多个父对象的图转换为XML,这样我就可以对其使用XQuery。 图表在左边,XML树在右边。 我通过写下第一个节点(节点1)中的所有子节点来转换图,并在返回的节点上重复该操作,直到不再存在子节点或者已经访问了一个节点(如节点2)。 此外,我还添加了一个约束,即如果选择了其中一个节点,则必须选择具有相同编号的所有节点。(例如,如果选择了节点2(1的子节点),那么我们还必须在XML树中选择节点2(6的子节点) 我可以在图上使用的操作有:getPatents、getChildren、readValue(节点)。 在图中,所有信息都存储在节点中,而在XML树中,节点的所有信息都存储为属性

我的问题:我想同步这两个结构,这样我就可以在图形和XML树上应用类似于轴的祖先(或后代),并得到相同的结果。(我可以用Python解析图形,用XQuery解析XML树)

我的问题:如果我在图上选择节点8并应用祖先函数,它将返回:4、5、2、1、6、3(由于循环的原因,返回6和3)。 XML树上的祖先轴将返回(我们必须同时选择这两个8):4、5、2、1(第二个2(6的子节点)也将由于约束而被选择,但不是节点6和3)

我的解决方案:更改祖先轴,使其返回选定节点的所有父节点,然后应用约束,然后再次选择所有父节点,依此类推。但这种解决方案似乎非常复杂且效率低下。还有更好的办法吗


感谢您的帮助

我认为要解决这个问题并不容易,因为对于这种特定的格式,XSLT/XQuery/XPath是大多数步骤或
所强加的文档顺序,除了
intersect
或XQuery分组所给出的任意顺序,这使得很难建立您想要的节点以及它们被遍历的顺序,我能想到的最简单的办法是

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';
declare option output:item-separator ', ';

declare variable $main-root := /;

declare function local:eliminate-duplicates($nodes as node()*) as node()*
{
    for $node at $p in $nodes
    group by $id := generate-id($node)
    order by head($p)
    return head($node)
};

declare function local:get-parents($nodes as element(node)*, $collected as element(node)*) as element(node)*
{
  let $new-parents := 
    for $p in local:eliminate-duplicates($nodes ! ..)
    return $main-root//node[@value = $p/@value][not(. intersect $collected)]
  return
    if ($new-parents)
    then local:get-parents($new-parents, ($collected, $new-parents))
    else $collected
};


local:get-parents(//node[@value = 8], ()) ! @value ! string()
给出
4,5,2,2,1,6,3


效率的高低部分取决于用于
节点[@value=$p/@value]
比较的任何索引,在XSLT中,您可以确保在面向数据库的XQuery处理器中使用键(),可能使用基于属性的索引。

XPath和XQuery有父轴和祖先轴,而不是函数。如果你想写一个沿着父轴运行的递归函数,你当然可以,但是你到底做了什么,哪里失败了?谢谢你的回答。我还没有实现任何东西,更多的是关于它是否可行或者是否有更好的方法来实现。我正在处理的XML文件有大约10k个节点,我不确定我的想法是否真的很好。真正的要求是什么?你为什么不在工作中使用明显的语言特性就试图这么做?不知道动机,很难帮助你。不想使用祖先轴似乎是一种不必要地使事情复杂化的方式。至于性能,最终将取决于XQuery处理器以及处理器或db允许您设置的任何索引上的基于属性的搜索。感谢您的回复。我更新了问题并添加了一个更好的示例。谢谢,这对我帮助很大:)