微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用xpath获取最深层嵌套的元素节点? (使用XMLTWIG实现)

我需要使用方法(DEST id =“RUSSIA”method =“delete”/>)和他的直接祖先(SOURCE id =“AFRICA”提取(XSLT,xpath,xquery …最好是xpath)最深层嵌套的元素节点“method =”modify“>).

我不想用方法获得顶级节点(main method =“modify”>或main method =“modify”>).

使用方法的最深嵌套元素对应于实际操作.
方法的顶级元素实际上是虚拟动作,不能被考虑在内.

这是我的XML示例文件

<?xml version="1.0" encoding="UTF-8"?>
<main method="modify">
<MACHINE method="modify">  
  <SOURCE id="AFRICA" method="modify">
    <DEST id="RUSSIA" method="delete"/>
    <DEST id="USA" method="modify"/>
  </SOURCE>

  <SOURCE id="USA" method="modify">
    <DEST id="AUSTRALIA" method="modify"/>
    <DEST id="CANADA" method="create"/>
  </SOURCE>
</MACHINE>
</main>

这是我期望的Xpath输出

<SOURCE id="AFRICA" method="modify"><DEST id="RUSSIA" method="delete"/>

<SOURCE id="AFRICA" method="modify"><DEST id="USA" method="modify"/>

<SOURCE id="USA" method="modify"><DEST id="AUSTRALIA" method="modify"/>

<SOURCE id="USA" method="modify"><DEST id="CANADA" method="create"/>

我当前的xpath命令无法提供足够的结果.

返回的命令xpath(“// [@ method] / ancestor :: *”):

<main><MACHINE method="modify">                                        # NOT WANTED

<MACHINE method="modify"><SOURCE id="AFRICA" method="modify">          # NOT WANTED

<MACHINE method="modify"><SOURCE id="USA" method="modify">             # NOT WANTED

<SOURCE id="AFRICA" method="modify"><DEST id="RUSSIA" method="delete"/>

<SOURCE id="AFRICA" method="modify"><DEST id="USA" method="modify"/>

<SOURCE id="USA" method="modify"><DEST id="AUSTRALIA" method="modify"/>

<SOURCE id="USA" method="modify"><DEST id="CANADA" method="create"/>

我的xmltwig代码了解更多信息(上下文):

#!/usr/bin/perl -w
use warnings;
use XML::Twig;
use XML::XPath;

@my $t= XML::Twig->new;
my $v= XML::Twig::Elt->new;
$t-> parsefile ('input.xml');

@abc=$t->get_xpath("\/\/[\@method]\/ancestor\:\:\*") ;
 foreach $v (@abc)   # outer 1
 {
    foreach $v ($v ->children)  # internal 1
    {
      $w=$v->parent;
      print $w->start_tag;
      print $v->start_tag;
    }
  }

解决方法

可以找到具有最大深度的节点

//*[count(ancestor::*) = max(//*/count(ancestor::*))]

但它可能表现可怕,取决于你的优化器有多聪明.

找到这些节点后,找到他们的祖先当然是微不足道的.但是你正在寻找比单独使用XPath更多结构的输出.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。