Re: supprimer une balise précèdent une autre
Eric van der Vlist <[email protected]>
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Organization | Dyomedea (http://dyomedea.com) |
| Message-ID | <[email protected]> |
Bonjour,
Le lundi 27 février 2006 à 18:10 +0100, Jean-Marc Desprez a écrit :
> Bonjour à tous
> J'ai un fichier xml qui correspond à ceci :
> <!-- je dois supprimer ce block -->
> <fo:block>
> <fo:leader line-height="10pt"/>
> </fo:block>
> <!-- qui est avant un block avec un leader ayant l'attribut line-height à
> 0pt -->
> <fo:block>
> <fo:leader line-height="0pt"/>
> </fo:block>
>
> pour supprimer le block voulu, j'utilise ceci :
> <xsl:template match="fo:block[following-sibling::fo:block[position()=1]/fo:
> leader/@line-height='0pt']"/>
>
> Déjà, je ne sais pas si j'emploi la bonne méthode (elle fonctionne mais il y
> a peut être mieux)
On peut la résumer légèrement en utilisant [1] au lieu de [position(à=1]
(c'est strictement équivalent):
<xsl:template match="fo:block[following-sibling::fo:block[1]/fo:
leader/@line-height='0pt']"/>
> J'aimerai ajouter deux "fonctionnalités"
> 1 - ne supprimer que si le block ne contient pas de texte
> si je garde l'expression xpath actuelle, le template deviendrai
> <xsl:template match="fo:block[following-sibling::fo:block[position()=1]/fo:
> leader/@line-height='0pt'] and
> fo:block[following-sibling::fo:block[position()=1]/fo:leader/text() = '' "/>
>
> y a t'il un moyen de faire plus simplement ?
<xsl:template match="fo:block[following-sibling::fo:block[1]/fo:
leader[@line-height='0pt' and fo:leader/text() = '']]"/>
> 2 - supprimer tous les tag de type block consécutifs (pas seulement le n-1 )
> qui précède le block@line-height="0pt"
> Là je ne vois pas de solution, si j'utilise ce template
> <xsl:template match="fo:block[
> following-sibling::fo:block/fo:leader/@line-height='0pt']"/>
> je vais avoir le problème suivant
>
> <!-- ce block sera supprimé à tord -->
> <fo:block>
> <fo:leader line-height="10pt"/>
> </fo:block>
> <!-- car il y a un autre tag entre deux -->
> <table>
> <autreBalise/>
> </table>
> <!-- il faut supprimer ce block -->
> <fo:block>
> <fo:leader line-height="10pt"/>
> </fo:block>
> <fo:block>
> <fo:leader line-height="0pt"/>
> </fo:block>
>
> Là je ne vois pas du tout de solution
Il y a plusieurs façons de procéder.
Une première façon de faire est de travailler en "pas à pas" un peu
comme je le montre dans http://xmlfr.org/documentations/faq/010103-0001.
On peut également essayer de procéder différemment.
Dans le tableau suivant, j'ai indiqué en (1) le nombre d'élements
précédents qui ne sont pas des fo:block et en (2) le nombre d'élements
précédents le prochain élément "marqueur" ne sont pas des fo:block...
(1)(2)
0 <fo:table/>
1 <fo:block><fo:leader line-height="0pt"/></fo:block>
1 1 <fo:block>...<fo:block>
1 <fo:block><fo:leader line-height="0pt"/></fo:block>
1 2 <fo:block>...<fo:block>
1 <fo:table/>
2 2 <fo:block>...<fo:block>
2 2 <fo:block>...<fo:block>
2 2 <fo:block><fo:leader line-height="0pt"/></fo:block>
Sauf erreur de ma part, on veut enlever les éléments fo:block "non
marqueurs" pour lesquels les deux valeurs sont égales.
Cela peut s'exprimer en XPath et s'utiliser soit directement soit avec
une clé, un peu comme on le fait pour filtrer les doublons (cf
http://xmlfr.org/documentations/faq/050331-0001).
Cordialement,
Eric van der Vlist
>
--
GPG-PGP: 2A528005
Did you know it? Python has now a Relax NG (partial) implementation.
http://advogato.org/proj/xvif/
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
-- Attached file included as plaintext by Ecartis --
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
iD4DBQBEBAioDvn+ZCpSgAURAvIdAJigMDtaIdpv2sRugGqbgoqGlUa5AJ0Sq/tQ
EUPyGvR7oMTsUG+g88xE+Q==
=5dxJ
-----END PGP SIGNATURE-----