Remplacer chaque caractère par autre en gardant la structure [Résolu] - XML/XSL - Programmation
Marsh Posté le 14-10-2022 à 19:13:57
Cale fait pas ça ?
https://stackoverflow.com/questions [...] ng-replace
Marsh Posté le 15-10-2022 à 17:36:45
Bonjour,
Cette feuille de style fait le taff :
Elle copie tout a l'identique, sauf le cas particulier ou tu veux ta transformation/.
Code :
|
Notes :
Code :
|
La même chose en xsl 3.0
Code :
|
A+,
Marsh Posté le 15-10-2022 à 18:26:09
Note que si tu es dans une boite, et que tu as professionnellement et couramment besoin de transformer du XML, tu devrais avoir l'outil standard pour (Oxygen XML Editor). Et une licence saxon, si tu as besoin de faire de la transfo xsl dans tes process (et pas seulement utiliser du xml transformé)
A+,
Marsh Posté le 17-10-2022 à 09:48:09
Grand merci à vous 2.
D'abord @rufo : effectivement, je m'étais basé sur cet article (tu peux remarquer que mon xsl y ressemble).
Mais surtout @gilou.
Cela fonctionne très bien. Ce que j'ai apprécié, ce sont tes explications et conseils.
Parfait ...et bravo
Bonne continuation à ce forum avec des personnes de bonnes volonté.
Peut-être qu'un jour, je pourrais également aider à mon tour....
Marsh Posté le 14-10-2022 à 08:07:04
Bien le bonjour la communauté .
Je vous expose mon souci. Un nouveau challenge à votre sagacité...
Je travaille depuis quelques temps avec les principes XLST pour modifier des xmls qui sont la source de notre "Document Management System".
Notre business, par charte graphique, ne veut pas de bullet mais un tiret pour l'indentation (puce).
Je ne peux agir que sur le contenu des valeurs des noeuds (pas dans la config du tinymce ou du DMS).
Mon but étant de remplacer chaque occurrence bullet "•" par un tiret (hyphen) tout en gardant la structure dans son noeud général "FreeText" (structure non modifiable).
A ce point, les remplacements s'effectuent mais il perd tous les noeuds enfants...
J'ai donc ceci comme xml, en entrée :
<?xml version="1.0" encoding="UTF-8"?>
<form>
<Document>
<Header>
<Message>
<MessageOriginalName>QUICK_DOCUMENTS</MessageOriginalName>
</Message>
</Header>
</Document>
<Eform>
<Selection_Heading1>FourthActor_1</Selection_Heading1>
<Selection_Heading2>Beneficiary_2</Selection_Heading2>
<Selection_Heading3>Beneficiary_1</Selection_Heading3>
<FreeText mediatype="text/xslfo">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:block>
<fo:list-block margin-bottom="12pt" margin-top="12pt">
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>•</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 1</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>•</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 2</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
</fo:block>
</fo:block>
</FreeText>
<SelectedAll>true</SelectedAll>
</Eform>
</form>
Et je voudrais par transformation xsl, ceci en sortie :
<?xml version="1.0" encoding="UTF-8"?>
<form>
<Document>
<Header>
<Message>
<MessageOriginalName>QUICK_DOCUMENTS</MessageOriginalName>
</Message>
</Header>
</Document>
<Eform>
<Selection_Heading1>FourthActor_1</Selection_Heading1>
<Selection_Heading2>Beneficiary_2</Selection_Heading2>
<Selection_Heading3>Beneficiary_1</Selection_Heading3>
<FreeText mediatype="text/xslfo">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:block>
<fo:list-block margin-bottom="12pt" margin-top="12pt">
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>-</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 1</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>-</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 2</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
</fo:block>
</fo:block>
</FreeText>
<SelectedAll>true</SelectedAll>
</Eform>
</form>
Grâce à mon dernier xsl ci-dessous, les remplacements s'effectuent mais il perd tous les noeuds enfants
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:param name="replace" select="'•'"/>
<xsl:param name="by" select="'-'"/>
<xsl:template match="*">
<xsl:if test="/form/Document/Header/Message/MessageOriginalName[contains(., 'QUICK_DOCUMENTS')]">
<xsl:choose>
<xsl:when test="name()='FreeText'">
<xsl:variable name="FT"><xsl:value-of select="string(/form/Eform/FreeText)"/></xsl:variable>
<FreeText mediatype="text/xslfo"><xsl:value-of select="replace($FT, $replace, $by)"/></FreeText>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="not(/form/Document/Header/Message/MessageOriginalName[contains(., 'QUICK_DOCUMENTS')])">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
J'obtiens ce mauvais xml généré :
<?xml version="1.0" encoding="UTF-8"?>
<form>
<Document>
<Header>
<Message>
<MessageOriginalName>QUICK_DOCUMENTS</MessageOriginalName>
</Message>
</Header>
</Document>
<Eform>
<Selection_Heading1>FourthActor_1</Selection_Heading1>
<Selection_Heading2>Beneficiary_2</Selection_Heading2>
<Selection_Heading3>Beneficiary_1</Selection_Heading3>
<FreeText mediatype="text/xslfo">-Ligne 1-Ligne 2</FreeText>
<SelectedAll>true</SelectedAll>
</Eform>
</form>
Si une âme charitable voudrait bien m'aider, je le remercie déjà d'avance...
Message édité par smilodongor le 17-10-2022 à 09:52:02