je dois extraire (XSLT, XPath, XQuery ... De préférence XPath) les plus profondément imbriqué élément noeuds avec méthode (DEST id = méthode "Russie" = "supprimer" />) et son ancêtre direct (SOURCE id = "AFRICA" method = "modify">).comment obtenir les nœuds les plus profondément imbriqués en utilisant xpath? (Mise en œuvre avec XMLTWIG)
Je ne veux pas obtenir les nœuds supérieurs avec des méthodes (méthode principale = "modifier"> ou méthode principale = "modifier">).
Les éléments imbriqués les plus profonds avec méthode correspondent à des actions réelles. Les éléments supérieurs avec méthode sont en réalité des actions factices qui ne doivent pas être prises en compte.
Voici mon exemple de fichier 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>
C'est sortie Xpath Je me attends:
<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"/>
Ma commande actuelle XPath ne fournit pas le résultat adéquat.
Commande XPath ("// [Méthode @]/ancêtre :: *") qui revient:
<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"/>
Mon code xmltwig pour plus d'informations (contexte):
#!/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;
}
}
Nous avons besoin XSLT si vous voulez manipuler les nœuds afin XPath seul peut Ne retirez pas les ancêtres que vous ne voulez pas. Considérons ensuite de poster des échantillons bien formés d'entrée et de sortie, donc pour l'échantillon d'entrée manque au moins une étiquette de fermeture et le résultat souhaité n'est pas bien formé, il n'est pas clair si vous voulez que l'élément 'SOURCE' contienne les éléments 'DEST' ou si vous voulez aplatir la hiérarchie existante et afficher tous les éléments au même niveau. –
J'ai corrigé/mis à jour ma question. Le fichier de sortie est le résultat de ma commande xpath '// [@ method]/ancestor :: *'. Faites moi savoir s'il est possible avec xpath de filtrer le noeud le plus éloigné avec la méthode (et d'inclure son ancêtre direct). Sinon possible (nous utilisons XSLT), je modifierai la question en ayant un fichier XML SORTIE – laurentngu
Je pense que trouver les éléments les plus profondément imbriqués n'est pas possible avec XPath parce que XPath ne dispose pas d'une fonction 'actuelle()'. Sinon, la solution serait de sélectionner tous les éléments pour lesquels il n'y a pas d'autres éléments avec un plus grand nombre d'ancêtres. En utilisant XSLT, cela peut être exprimé. –