用于导航以XML编码的图形结构的XPath
发布时间:2020-12-16 22:46:40 所属栏目:百科 来源:网络整理
导读:我有一个用 XML编码的图形结构.有针对性的非循环图,确切地说. 节点是唯一标识的,并且具有编码的后继 – 前驱关系. 是否可以构造一个XQuery或XPath函数,它导航图形以找到满足简单条件的第一个节点? 更准确地说,让我们采用以下XML文档: ?xml version="1.0" e
我有一个用
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. /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解决方案: 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. 为了返回不同的节点,我们可以使用 我在Saxon HE中测试了这些变化: java -cp /usr/local/Cellar/saxon/9.5.1.6/libexec/saxon9he.jar net.sf.saxon.Query -q:test.xq | xmllint --format - (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |