Comme ça fait un bon exercice de XSLT, je vais y répondre dans ce langage:
A la base, en xslt c'est simple:
Code :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<!-- On copie tout sauf les nœuds TRAJ qui n'ont pas la bonne valeur d'attribut -->
<xsl:template match="TRAJ[@tron ne 'TRONROUT0000000000193776']"/>
</xsl:stylesheet>
|
Si tu veux exactement le même formatage en sortie qu'en entrée, comme tu n'as pas de modèle (dtd, rng...) associé, le parseur xsl ne peut savoir si ton formatage entre les TRAJ consiste en vrai nœuds texte significatifs pour le modèle ou pas. Il faut alors faire a la main le boulot pour ces nœuds texte.
Idem pour le formatage après la déclaration xml.
Ça donne une feuille de style un poil plus complexe, mais à peine:
Code :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:param name="filter-value" select="'TRONROUT0000000000193776'"/>
<!-- Pour conserver le formatage après la déclaration -->
<xsl:template match="/">
<xsl:text> </xsl:text>
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<!-- copie des nœuds avec la bonne valeur d'attribut et des nœuds texte ad-hoc -->
<!-- ie ceux avant une ligne non effacée et le dernier au cas ou toutes les lignes avec TRAJ seraient effacées -->
<xsl:template match="TRAJS">
<xsl:copy>
<xsl:apply-templates select="TRAJ[@tron=$filter-value]
|text()[following-sibling::*[1][self::TRAJ[@tron=$filter-value]]]
|text()[position()=last()]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
|
Et tant que j'y étais, j'ai passé la valeur d'attribut filtrante comme un paramètre de la feuille de style (donc pouvant être positionné à l'appel) de valeur par défaut celle que tu donnes dans ton exemple.
Et sinon, pour ton programme perl, c'est parce que dans ton handler, tu cut les elements avec la mauvaise valeur d'attribut, mais tu ne dis pas ce que tu fais avec ceux qui ont la bonne: $TRAJ->print.
Ce qui donne en mettant tout ça au propre:
Code :
#!/usr/bin/env perl use strict; use warnings; use autodie; use XML::Twig; sub parse_xml { my($infile, $outfile, $filter) = @_; open(my $fhout, '>', $outfile); my $twig = XML::Twig->new( twig_roots => { 'TRAJ' => 1 }, twig_print_outside_roots => $fhout, twig_handlers => {'TRAJ' => sub{handler(@_, $filter);},}, PrettyPrint =>'indented', )->parsefile($infile); } sub handler { my ($twig, $TRAJ, $filter)= @_; ($TRAJ->att('tron') ne $filter)?$TRAJ->cut:$TRAJ->print; } parse_xml('test.xml', 'traj_mini.xml', 'TRONROUT0000000000193776');
|
En sortie, c'est identique a ce que donnent mes 5 lignes de xsl du début de mon post.
A+,
Message édité par gilou le 16-02-2018 à 14:03:54
---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --