jak uzyskać najgłębiej zagnieżdżone węzły elementów przy użyciu xpath? (implementacja z XMLTWIG)
Muszę wyodrębnić (XSLT, xpath, xquery ... Najlepiej xpath)najgłębiej zagnieżdżony element węzły zmetoda (DEST id = "ROSJA" method = "delete" />) i jego bezpośredni przodek (SOURCE id = "AFRICA" method = "modify">).
Nie chcę otrzymywać najlepszych węzłów metodami (main method = "modify"> lub main method = "modify">).
Najgłębsze zagnieżdżone elementy z metodą odpowiadają rzeczywistym działaniom. Pierwszymi elementami z metodą są w rzeczywistości atrapy akcji, które nie mogą być brane pod uwagę.
Oto mój przykładowy plik 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>
To jest wyjście Xpath, którego oczekuję:
<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"/>
Moje aktualne polecenie xpath nie zapewnia odpowiedniego wyniku.
Polecenie xpath ("// [@ method] / ancestor :: *"), które powraca:
<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"/>
Mój kod xmltwig dla dodatkowych informacji (kontekst):
#!/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;
}
}