我有一个用
XML编码的图形结构.有针对性的非循环图,确切地说.
节点是唯一标识的,并且具有编码的后继 – 前驱关系.
节点是唯一标识的,并且具有编码的后继 – 前驱关系.
是否可以构造一个XQuery或XPath函数,它导航图形以找到满足简单条件的第一个节点?
更准确地说,让我们采用以下XML文档:
<?xml version="1.0" encoding="UTF-8"?> <doc> <obj> <id>1</id> <name>FINDME</name> <relations> <successor>2</successor> </relations> </obj> <obj> <id>2</id> <relations> <predecessor>1</predecessor> <successor>3</successor> </relations> </obj> <obj> <id>3</id> <relations> <predecessor>2</predecessor> </relations> </obj> </doc>
我们假设,当前节点是3.
我想找到一个前任节点的id,它的名称标签等于“FINDME”.
为此,我可以使用以下XPath:
/doc/obj[name='FINDME' and id=/doc/obj[ id=/doc/obj[ id=3 ]/relations/predecessor ]/relations/predecessor ]/id
是否可以概括查询以处理任意级别的关系?
编辑:joemfb答案确实回答了这个问题.我有一个额外的请求,它可以处理一个节点的多个前任并返回任何节点不超过一次?
因此,它也适用于以下示例:
<?xml version="1.0" encoding="UTF-8"?> <doc> <obj> <id>1</id> <name>FINDME</name> <relations> <successor>2</successor> <successor>4</successor> </relations> </obj> <obj> <id>4</id> <relations> <successor>2</successor> <predecessor>1</predecessor> </relations> </obj> <obj> <id>2</id> <relations> <predecessor>1</predecessor> <predecessor>4</predecessor> <successor>3</successor> </relations> </obj> <obj> <id>3</id> <relations> <predecessor>2</predecessor> </relations> </obj> </doc>
解决方法
如果我理解你的要求,你想找到前辈的前身,只要它们存在.这是递归函数的完美应用.
xquery version "1.0"; declare function local:predecessors($doc,$node) { let $immediate-predecessor := $doc/doc/obj[id = $node/relations/predecessor] return if (fn:exists($immediate-predecessor)) then ( $immediate-predecessor,local:predecessors($doc,$immediate-predecessor) ) else () }; let $doc := document { (: your doc ... :) } let $results := local:predecessors($doc,$doc/doc/obj[id eq "3"]) return element results { $results intersect $results }
更新:
为了支持多个前趋元素,谓词[id = $node / relations / predecessor]需要一般比较operator =,它支持任一操作数中的序列,而不是值比较运算符eq.
为了返回不同的节点,我们可以使用intersect
operator,它返回两个操作数共有的一系列唯一节点(我也可以使用union,类似地返回唯一节点).
我在Saxon HE中测试了这些变化:
java -cp /usr/local/Cellar/saxon/9.5.1.6/libexec/saxon9he.jar \ net.sf.saxon.Query -q:test.xq | xmllint --format -
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。