Bonjour à tous,
je possède un fichier xml du type :
[?xml version="1.0" encoding="utf-8"?]
[A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"]
[B1]
[C1]xx[/C1]
[C2]yy[/C2]
[/B1]
[B2]
[C3]dsfhizu[/C3]
[C4]
[D1]zoibvd[/D1]
[D2]0[/D2]
[/C4]
[/B2]
[B2]
[C3]ii[/C3]
[C4]
[D1]fazoifbvza[/D1]
[D2]0[/D2]
[/C4]
[/B2]
[B2]
[C3]mliohszaz[/C3]
[C4]
[D1]cvkjbsdhzpz[/D1]
[D2]1[/D2]
[/C4]
[/B2]
[/A]
Et je souhaiterais enlever tous les éléments B2 pour lesquels la balise D2 est à 1, et garder le reste des informations identiques.
J'ai un peu de mal à trouver la syntaxe XSL correspondante. J'ai bien essayé ça :
[xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"]
[xsl:output method="xml" indent="yes"/]
[xsl:strip-space elements="*"/]
[xsl:template match="/"]
[xsl:element name="A"]
[xsl:for-each select="/A/B1"]
[xsl:copy-of select="."/]
[/xsl:for-each]
[xsl:for-each select="/A/B2[C4/D2=0]"]
[xsl:copy-of select="."/]
[/xsl:for-each]
[/xsl:element]
[/xsl:template]
[/xsl:stylesheet]
Mais le namespace, au lieu de se placer au niveau de A, se retrouve ventilé sur tous les éléments B1 et B2...
Si quelqu'un a une idée...
Merci d'avance !
# J'espère que c'est pas tes devoirs
Posté par fcartegnie . Évalué à 2.
[xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"]
[xsl:output method="xml" indent="yes"/]
[xsl:template match="/A"]
[xsl:element name="A"]
[xsl:apply-templates select="./*"/]
[/xsl:element]
[/xsl:template]
[xsl:template match="B2"]
[xsl:if test="number(./C4/D2) < 1"]
[xsl:element name="B2"]
[xsl:copy-of select="./*"/]
[/xsl:element]
[/xsl:if]
[/xsl:template]
[/xsl:stylesheet]
[^] # oups
Posté par fcartegnie . Évalué à 2.
[xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"]
[xsl:output method="xml" indent="yes"/]
[xsl:template match="/A"]
[xsl:element name="{name()}"]
[xsl:copy-of select="./B2[number(C4/D2)<1]" copy-namespaces="no"/]
[/xsl:element]
[/xsl:template]
[/xsl:stylesheet]
Mais ne passera pas avec libxml. (xslt 1.0)
[^] # Re: oups
Posté par Papey . Évalué à 1.
Ton fichier se comporte comme celui que j'ai indiqué, sauf qu'il ne préserve pas les éléments B1, et que j'ai toujours les namespaces sur B2 au lieu de les avoir sur A ! Peut-être que mon moteur XSLT ne se comporte pas bien (j'utilise Editix) ?
[^] # Re: oups
Posté par fcartegnie . Évalué à 2.
suffit de changer
[xsl:for-each select="/A/B2[C4/D2=0]"]
en
[xsl:for-each select="/A/B2[C4/D2=0] /A/B1"]
et t'auras les B1 avec
[^] # Re: oups
Posté par fcartegnie . Évalué à 2.
Comme mentionné, faut du xslt 2.0
Mais tu peux tjs forcer le namespace sur A
[xsl:element name="{name()}" namespace="{namespace-uri()}"]
# Toujours pas...
Posté par Papey . Évalué à 1.
[^] # Re: Toujours pas...
Posté par Papey . Évalué à 1.
Merci et A+
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.