Xpath 将图形与XML树同步并对其应用轴
我将一个具有循环和多个父对象的图转换为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) 我的解决方案:更改祖先轴,使其返回选定节点的所有父节点,然后应用约束,然后再次选择所有父节点,依此类推。但这种解决方案似乎非常复杂且效率低下。还有更好的办法吗Xpath 将图形与XML树同步并对其应用轴,xpath,xquery,Xpath,Xquery,我将一个具有循环和多个父对象的图转换为XML,这样我就可以对其使用XQuery。 图表在左边,XML树在右边。 我通过写下第一个节点(节点1)中的所有子节点来转换图,并在返回的节点上重复该操作,直到不再存在子节点或者已经访问了一个节点(如节点2)。 此外,我还添加了一个约束,即如果选择了其中一个节点,则必须选择具有相同编号的所有节点。(例如,如果选择了节点2(1的子节点),那么我们还必须在XML树中选择节点2(6的子节点) 我可以在图上使用的操作有:getPatents、getChildren、
感谢您的帮助我认为要解决这个问题并不容易,因为对于这种特定的格式,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允许您设置的任何索引上的基于属性的搜索。感谢您的回复。我更新了问题并添加了一个更好的示例。谢谢,这对我帮助很大:)